#128 - Thiết kế Docker Container thế nào cho hiệu quả?
Những bài viết hay
Using Neural Networks to Find Answers in Tables - Google AI Blog — ai.googleblog.com
Phần lớn thông tin được lưu trữ dưới dạng bảng (tabular data). Tuy nhiên, để tìm kiếm hay truy vấn một cách tự động dữ liệu dạng bảng vẫn là một thách thức đối với ngành khoa học máy tính. Ứng dụng những 'technique' của xử lý ngôn ngữ tự nhiên vào bài toán đang là một hướng đi mới trong những năm gần đây. Trong bài nghiên cứu này, những tác giả đến từ Google giới thiệu một phương pháp mới có thể tăng tốc độ cũng như chất lượng việc truy vấn thông tin dạng dữ liệu này.
Với cách tiếp cận truyền thống, đầu tiên, dữ liệu dạng bảng sẽ được 'converted' và 'imported' vào cơ sở dữ diệu. Bước tiếp theo, kỹ thuật ‘semantic parsing’ được áp dụng để chuyển đổi câu hỏi từ dạng tự nhiên sang dạng SQL và dùng phiên bản này để truy vấn thông tin từ cơ sở dữ liệu.
Ví dụ:
Câu hỏi dạng tự nhiên là: "How many world champions are there with only one reign?"
Câu hỏi sạng SQL là: "select count(*) where column("No. of reigns") == 1;"
Cách tiếp cận này gặp những khó khăn nhất định như rất khó đảm bảo tính chính xác về ngữ nghĩa của câu hỏi ban đầu sau khi chuyển đổi sang dạng SQL. Trong paper "TAPAS: Weakly Supervised Table Parsing via Pre-training", với việc sử dụng kiến trúc Bert để "encode" cả câu hỏi và dữ liệu, các tác giả hy vọng sẽ giải quyết được những khó khăn trên. Ngoài việc "encode" trên, tác giả còn dùng thêm những lớp "embedding" để đại diện cho vị trí các điểm dữ liệu trong bảng như chỉ số cột, chỉ số hàng hay một chỉ số đặc biệt để thể hiện thứ tự giữa các giá trị. "Output" của mô hình sẽ là xác suất một ô trong bảng thuộc câu trả lời và "aggregation operator" để tạo ra câu trả lời cuối cùng.
Thử nghiệm mô hình trên 3 tập dữ liệu lớn SQA, WikiTableQuestions, WikiSQL cho thấy những kết quả rất hứa hẹn. So sánh với những mô hình SOTA (state of the art) của từng tập dữ liệu, TAPAS vượt trội 12 điểm đối với tập SQA , 4 điểm với tập WTQ và có kết quả tương đương khi thử trên tập WikiSQL.
Profiling CPython at Instagram - Instagram Engineering — instagram-engineering.com
Python là một trong những ngôn ngữ thông dụng hiện nay và được Instagram dùng để lập trình hệ thống backend của họ. Trong đó, CPython được dùng chính để thi hành các hệ thống. Do lượng người dùng Instagram ngày càng gia tăng, đội ngũ kỹ sư ở Instagram đã phải bắt đầu tìm cách tối ưu hóa hệ thống Instagram. Profiling CPython là một trong những cách họ đã dùng tới để tìm những opcode được sử dụng nhiều trong hệ thống và để hiểu rõ hơn về khối lượng công việc và thời gian vận hành của mỗi công việc. Bài viết sau đây được tác giả nói rõ hơn về cách mà Instagram đã áp dụng kỹ thuật profiling Cpython để tối ưu hóa hệ thống của họ như thế nào.
Best practices for building containers - Google Cloud — cloud.google.com
Việc sử dụng Docker đã trở nên ngày càng quen thuộc với các dev ngày nay. Tuy nhiên việc build các docker image sao cho hiệu quả, an toàn, và ổn định thì không phải ai cũng nắm hết được. Bài viết chi tiết của Google tổng hợp các lưu ý với mức độ quan trọng từ cao đến thấp, giúp chúng ta hiểu hơn về việc xây dựng các Docker Container, để chúng có thể hoạt động tốt nhất.
Những điều cần lưu tâm cho các dev được Google nhắc đến khi xây dựng một Docker container là:
Mỗi container chỉ chạy một ứng dụng: khi làm việc với container, một sai lầm phổ biến là coi chúng như một máy ảo có thể chạy được nhiều thứ cùng một lúc. Một container có thể chạy được theo cách này, nhưng sẽ làm giảm đi rất nhiều lợi ích của thiết kế container. Một lý do quan trọng là container được thiết kế để có chung 1 vòng đời (lifecyccle) như ứng dụng đang chạy trong nó. Khi container khởi động, ứng dụng cũng sẽ khởi động theo. Tương tự, khi ứng dụng dừng lại, thì container cũng sẽ như vậy.
Lưu ý khi xử lý PID 1, kiểm soát các signal và các processes: Linux sử dụng các tín hiệu (signals) như 1 cách chính để điều khiển vòng đời của các processes trong 1 container. Vì vậy để kiếm soát tốt vòng đời của 1 ứng dụng, chúng ta cần lưu tâm đến việc xử lý các signal của Linux. TÍn hiệu quan trọng nhất trong Linux là SIGTERM bởi vì chúng sẽ ngừng 1 process. Ứng dụng có thể nhận tín hiệu SIGKILL, được sử dụng để dừng 1 process một cách đột ngột, hoặc SIGINT, được gửi khi ta gõ Ctrl+C.
Trong môi trường containers, PIDs và các tín hiệu Linux tạo ra 2 vấn đề chúng ta cần lưu tâm. Thứ nhất đó là cách Linux kernel xử lý các tín hiệu, thứ hai là cách các init sysem xử lý các orphan processes. Vậy ta có thể xử lý những vấn đề này như thế nào?
Tối ưu cache trong quá tình build Docker image: việc này sẽ giúp chúng ta rất nhiều thời gian trong quá trình build. Docker image được build theo từng lớp, và trong Dockerfile, mỗi chỉ dẫn sẽ tạo ra 1 lớp trong image được build. Trong quá trình build, Docker sẽ cố gắng tận dụng lại các lớp đã được build từ những lần build khác nhiều nhất có thể.
Loại bỏ những tools không cần thiết: Để bảo vệ ứng dụng khởi các cuộc tấn công bên ngoài, hãy cố gắng giảm thiểu việc cài đặt các tool không cần thiết.
Build image nhỏ nhất có thể: Các image nhỏ gọn giúp chúng ta upload và download nhanh hơn, điều này đặc biệt quan trọng cho việc khởi động 1 pod trong Kubernetes. Để làm được điều này, chúng ta có thể sử dụng 1 base nhỏ gọn cho image, giảm thiếu những cài đặt không cần thiết hay tạo image từ các lớp chung.
Scan các lỗi trong các Container Registry: các lỗi trong phần mềm là rất khó tránh khỏi. Chúng ta có thể phát hiện ra các vấn đề nhất định bằng cách sử dụng một hệ thống tập trung có khả năng liệt kê các gói cài đặt, thông báo các lỗi và vá chúng.
Tag các image một cách khoa học: điều này giúp chúng ta tạo ra các phiên bản của image một cách chính xác. Quan trọng hơn, khi có thay đổi cần cập nhật, sẽ không ảnh hưởng đến các phiên bản cũ đang được sử dụng trong các môi trường khác nhau.
Cân nhắc khi nào nên sử dụng một public image và lưu ý về licenses.
Code & Tools
Góc Database
Là một trong những công ty Internet hàng đầu thế giới hiện nay cung cấp những dịch vụ cho hàng triệu người dùng như Google Search, Youtube, Gmail, … lượng dữ liệu mà Google lưu trữ và xử lý hàng ngày có thể nói là vô cùng lớn.
Để cung cấp được những insight từ lượng dữ liệu này, trong hệ thống nội bộ của Google có một service nội bộ tên là Dremel, cung cấp cơ chế để chạy những câu lệnh SQL với thời gian ngắn. Hệ thống này được sử dụng bởi các bạn Engineer, Analyst, Operation, … để giải đáp những câu hỏi đại loại như:
Số lượng impressions của Adwords ở khu vực Tokyo trong ngày hôm qua là bao nhiêu?
Vẽ đồ thị biểu diễn khuynh hướng (trend) của Adwords traffic trong một khu vực nào đó vào các khung giờ trong ngày
Nếu Dremel là một phiên bản nội bộ thì Google BigQuery là phiên bản dành cho công chúng (public) trên cùng một nền tảng. BigQuery cung cấp những tính năng tương tự Dremel cho các lập trình viên bên ngoài Google với những thành phần như: REST API, giao diện command line, Web UI, … với kiến trúc hạ tầng tương tự Dremel.
Mời các bạn đọc bài lược dịch này để hiểu thêm về BigQuery cũng như biết được sự khác biệt giữa Big Query và các công nghệ tương tự khác là như thế nào.
Security
Sau khi phiên bản iOS 14 beta được ra mắt, khi người dùng sử dụng Zalo sẽ nhận được thông báo "Zalo pasted from...", thể hiện ứng dụng đang lấy dữ liệu từ bộ nhớ tạm của máy, làm dấy lên lo ngại về các vấn đề bảo mật cũng như quyền riêng tư của người dùng. Với TikTok, mỗi khi người dùng bắt đầu gõ bất cứ thứ gì vào khung bình luận, ứng dụng này lập tức lấy dữ liệu từ bộ nhớ tạm, nhưng lại không dán các dữ liệu này vào. iOS 14 liên tục đưa ra cảnh báo TikTok đã truy cập dữ liệu từ bộ nhớ tạm này. Các bạn có thể đọc chi tiết tại đây. Ngoài ra, theo Nake Security, có hơn 53 ứng dụng phổ biến khác cũng đang có chung phương pháp hoạt động. Và câu hỏi quan trọng nhất được đặt ra lúc này, đó là liệu các ứng dụng trên có gửi các dữ liệu này ra bên ngoài thiết bị của người dùng hay không?
Một tin tặc đã đăng thông báo đòi tiền chuộc của 22.900 cơ sở dữ liệu MongoDB có thể truy cập trực tuyến mà không cần mật khẩu, chiếm khoảng 47% tất cả các cơ sở dữ liệu truy cập trực tuyến của MongoDB. Nếu bạn đang băn khoăn việc lựa chọn MongoDB làm cơ sở dữ liệu, có lẽ câu chuyện này sẽ khiến bạn cân nhắc kỹ hơn.
Ngày 23/6, Tập đoàn công nghệ Bkav phát đi cảnh báo về hệ thống gián điệp VN84App tấn công người dùng Việt Nam. Theo kết quả phân tích, phần mềm gián điệp có thể xâm nhập vào smartphone để theo dõi, lấy dữ liệu người dùng và gửi về máy chủ điều khiển. Tại Việt Nam, ước tính đã có hơn 300 nạn nhân chỉ trong một thời gian ngắn. Phần mềm gián điệp VN84App phát tán thông qua các website giả mạo cơ quan chức năng, một trong số đó là trang giả mạo Bộ Công an. Hacker lừa người dùng truy cập vào website này và tải về điện thoại ứng dụng VN84App dưới dạng tập tin .apk. Khi được cài đặt thành công, VN84App sẽ âm thầm thu thập tin nhắn, số điện thoại, thông tin IMEI… gửi về máy chủ điều khiển của hacker. Các bạn có thể đọc chi tiết báo của của BKAV tại đây.
Quotes
In order to be irreplaceable, one must always be different
– Coco Chanel