#159 - Scaling Email Infrastructure for Medium Digest
Nhân dịp chào đón năm mới 2021, Tết cổ truyền dân tộc, BBT Grokking Newsletter xin gửi tới quý bạn đọc lời chúc sức khỏe, thành đạt, hạnh phúc, An - Khang - Thịnh - Vượng.
Trong năm mới, Grokking Newsletter sẽ tiếp tục cập nhật, đổi mới và nâng cao chất lượng để phục vụ bạn đọc tốt hơn.
Grokking Newsletter sẽ tạm dừng trong hai tuần và quay trở lại vào ngày 28/2/2021.
Thân ái
BBT Grokking Newsletter
Những bài viết hay
10 Design Patterns every Software Architect and Software Engineer must know — ravindraelicherla.medium.com
Công nghệ càng ngày càng được áp dụng rộng rãi vào mọi mặt của cuộc sống với những vai trò và lĩnh vực khác nhau. Mỗi ứng dụng sẽ giải quyết các vấn đề khác nhau với sự khác biệt và đa dạng về tính năng, quy mô, phạm vi, ... Vì vậy việc thiết kết hệ thống sẽ phụ thuộc rất nhiều vào đặc thù của mỗi business. Không có một thiết kế nào phù hợp cho tất cả các ứng dụng. Tuy nhiên, luôn có những thách thức chung mà mỗi thiết kế sẽ trọng tâm vào một vài vấn đề trong số đó để giải quyết và ưu tiên. Những thách thức đó có thể gói gọn vào: Availability, Scalability, Resiliency, Data Management, Performance and Security.
Trong bài viết, tác giả sẽ giải thích chi tiết về mỗi yếu tố kể trên, qua đó gợi ý cho chúng ta về 10 design pattern có thể áp dụng vào những hoàn cảnh thích hợp.
Dưới đây là 10 design patterns và các vấn đề trọng tâm mà mỗi pattern giải quyết được tác giả nhắc đến bao gồm:
Command Query Responsibility Segregation (CQRS): Scalability and Performance
Anti Corruption Layer Pattern: Data Management, Security
Circuit Breaker Pattern: Resiliency, Fault Tolerance
Event Sourcing: Scalability, Resiliency and Performance
Publisher-Subscriber pattern: Scalability, Resiliency, Fault Tolerance and Performance
Sharding Pattern: Scalability, Data Management and Performance
Strangler Pattern: Data Management
Saga Pattern: Data Management, Security
Throttling Pattern: Availablity, Resiliency
Static content hosting pattern: Availablity, Performance
React as a UI Runtime — overreacted.io
Trong bài viết, Dan Abramov đến từ React team đã sử dụng một góc nhìn khác để mô tả về React core cũng như đi sâu vào các programming model của React: sử dụng React như một UI Runtime. Từ đó, người đọc có thể hiểu rõ và sâu hơn về cách hoạt động của React.
Rust: A unique perspective — limpet.net
Trong lập trình nói riêng, và trong hệ thống thông tin nói chung, các bài toán sau là đơn giản:
lập trình khi có duy nhất một tác nhân thay đổi
lập trình khi có nhiều tác nhân nhưng chỉ đọc
Điều này đúng cho cả lập trình đơn luồng và đa luồng. Tuy nhiên, bài toán sẽ khó hơn nhiều khi có nhiều tác nhân có thể thay đổi trên cùng một dữ liệu.
Bài viết sau đây, thông qua góc nhìn mới, thay vào một biến immutable/mutable , ta nhìn dưới lăng kính shared/unique để giải thích cách Rust xử lí các vấn đề trên.
Scaling Email Infrastructure for Medium Digest — medium.engineering
Medium Digest là hệ thống gửi thư hàng ngày của dịch vụ Medium cho người dùng của họ. Hệ thống này sẽ gửi email tới người dùng vào khoảng 8-9am mỗi ngày tại múi giờ mà người dùng họ đang ở. Các email này thông thường được cá nhân hóa dựa trên sở thích và lịch sử đọc của người dùng Medium. Hệ thống Medium Digest được xây dựng trên Amazon’s Simple Queuing Service để tiếp nhận và xử lý các tác vụ. Medium Digest được chia làm 3 công đoạn chính:
Shard events: Cứ mỗi 10 phút, một tác vụ Jenkin được kích hoạt để đọc user email và múi giờ ở mỗi shard. Sau đó, các shard này sẽ tạo ra các “generation events" cho công đoạn tiếp theo
Generation events: Nhiệm vụ chính của công đoạn này là để truy vấn các thông tin cần gửi cho người dùng (ví dụ như là tin tức người dùng có thể hứng thú)
Send events: Sau khi email được thiết lập từ dữ liệu ở công đoạn 2, hệ thống sẽ gửi các events này tới dịch vụ SendGrid để gửi email tới người dùng
Hệ thống Medium Digest được thiết kế khá là đơn giản và đạt được năng suất khá tốt lúc bấy giờ (xử lý khoảng 500 events mỗi giây). Tuy nhiên, do ngày càng có nhiều người dùng Medium, hệ thống Medium Digest từ từ đạt tới mức quá tải vào tháng 9 năm 2019. Do đó, các đội ngũ kỹ sư ở Medium phải bắt tay vào việc cải thiện hệ thống này. Bài viết sau dây được tác giả nói cụ thể về quá trình cải thiện Medium Digest như là:
Tách rời send events ở công đoạn 3 vào một queue riêng
Giảm số events cần phải xử lý dựa vào thông tin hoạt động của người dùng
Trải đều generation events ở công đoạn 2 để giảm lượng events không đều đặn tới hệ thống recommedation của Medium
Góc Database
Trong các hệ thống cơ sở dữ liệu phân tán thì vấn đề tính nhất quán (consistency) của dữ liệu rất quan trọng. Dù cho cơ chế bạn đang sử dụng là strong consistency hay eventual consistency thì vẫn sẽ phát sinh tình huống như lỗi mạng, lỗi kết nối, lỗi ghi xuống đĩa, ... dẫn đến sự sai khác giữa các phiên bản của cùng một dữ liệu trên các node khác nhau.
Ở newsletter kỳ 157, chúng ta đã được giới thiệu về một trong các kỹ thuật để đảm bảo tính nhất quán đó là Merkle Tree, một kỹ thuật sử dụng cây nhị phân dạng hash-tree để phát hiện sự sai khác dữ liệu giữa các node và tìm cách chỉnh sửa.
Bên cạnh Merkle tree, một kỹ thuật khác cũng được sử dụng đó là Conflict-free Replicated Data Types (CRDT). CRDT là thuật ngữ chỉ một tập các cấu trúc dữ liệu được thiết kế hướng đến việc lưu trữ được trên nhiều node với các đặc tính như:
Dữ liệu trên một replica có thể được chỉnh sửa mà không cần phải coordinate với các replica khác.\
Khi hai replica bất kỳ nhận được cùng một tập các lệnh updates giống nhau (nhưng khác thứ tự), dữ liệu được lưu trữ trên chúng sẽ dần trở thành giống nhau.
Mời các bạn cùng đọc paper kỳ này để tìm hiểu thêm về cách thiết kế chi tiết của CRDT nhé. Link.
Góc Data Warehouse
Hadoop Distributed File System (HDFS) là một trong những distributed file system được sử dụng rộng rãi ở các data warehouse lớn. HDFS được xây dựng bởi các đội ngũ kỹ sư ở Yahoo và được cho ra đời vào năm 2006 dựa trên khá là nhiều ý tưởng giống với những distributed file system nổi tiếng lúc bấy giờ (như là Google File System - GFS).
Kiến trúc của HDFS đa số tập trung vào 3 thành phần chính là:
NameNode: Là thành phần chính để chứa các siêu dữ liệu (metadata) về các thông tin quan trọng trong hệ thống (như là data files, namespace, permission, etc). Đồng thời, NameNode có nhiệm vụ tính toán và tối ưu hóa vị trí các block dữ liệu trên DataNodes để dữ liệu được rải rác một cách hiệu quả trên nhiều cụm máy chủ.
DataNode: Là thành phần chính để chứa dữ liệu trong hệ thống. Mỗi block dữ liệu trên DataNode được thành lập bởi 2 tập tin trên máy chủ đó. Tập tin đầu được dùng để chứa dữ liệu chính. Còn tập tin thứ hai được dùng để chứa siêu dữ liệu cho block đó (như là checksums và thời điểm block được tạo ra). Trong lúc khởi động hệ thống thì các DataNodes sẽ kết nối với NameNode để thực hiện việc bắt tay kiểm chứng các DataNodes này
HDFS Client: Người dùng sẽ sử dụng thành phần này để đọc và viết dữ liệu trên HDFS. Để đọc dữ liệu, HDFS client đầu tiên sẽ hỏi NameNode về các DataNodes chứa dữ liệu này. Sau đó, HDFS client sẽ kết nối với các DataNodes này để truy vấn dữ liệu. Còn về phần viết dữ liệu lên HDFS thì HDFS client đầu tiên sẽ hỏi NameNode về các DataNodes để chứa dữ liệu cần được truyền tải. Sau đó, HDFS client sẽ tự động kết nối với các DataNodes này để viết dữ liệu
Bài báo sau đây được xuất bản trên hội nghị MSST vào năm 2010 bởi các kỹ sư chính ở Yahoo lập nên hệ thống HDFS này. Bài báo nói cụ thể cách HDFS hoạt động như thế nào và đồng thời đề cập tới các benchmarks họ gom góp được bằng cách vận hành HDFS cho data warehouse ở Yahoo lúc bấy giờ
Code & Tools
This Week Sponsors
POPS is a creative, innovative & hyper-growth working environment where storytelling meets technology.
POPS is the leading digital entertainment company in Southeast Asia. With over 12 years in entertainment, we provide thousands of exclusive, high-quality, carefully curated local and international contents and bring a unique entertainment experience through POPS Original series, concerts, movies, comics, esports and more.
We are on a journey to find talents who are passionate about technology and love to develop POPS APP the digital entertainment product with the latest technologies such as: OTT, Video On Demand, Microservices, etc. to give end users in the region great experiences with an all-inclusive digital entertainment platform.
Góc Tuyển Dụng
Visit https://popsww.com/en/careers for current job openings.
Quotes
It is not the language that makes programs appear simple. It is the programmer that make the language appear simple!
- Robert C. Martin