GuidanceSubmissions
30:00
Guidance

Thiết kế hệ thống gửi Email Marketing tự động

cho tệp khách hàng 1 triệu người mà không làm chậm quá trình đăng nhập của người dùng.

Thiết kế hệ thống gửi Email Marketing tự động

NOT SAVED
0 words·0 / 8,000 chars
Thiết kế hệ thống

Kiến trúc Giao tiếp Bất đồng bộ

Thiết kế hệ thống bất đồng bộ là sự thừa nhận rằng không phải tác vụ nào cũng cần xử lý ngay lập tức. Đây là nghệ thuật tách rời các dịch vụ thông qua hàng đợi và tác vụ nền để bảo vệ độ khả dụng của hệ thống, đánh đổi tính nhất quán thời gian thực lấy khả năng mở rộng khổng lồ.

Step 1

Xác định Nút thắt Đồng bộ

Bắt đầu bằng việc tách biệt luồng xử lý cốt lõi khỏi các tác vụ nền. Nếu một hành động không yêu cầu phản hồi ngay lập tức cho người dùng, hãy đẩy nó ra khỏi luồng chính. Ví dụ, khi người dùng đăng ký, việc tạo bản ghi trong DB là đồng bộ (cần xác nhận ngay), nhưng việc gửi email chào mừng, tạo dữ liệu gợi ý, hoặc đồng bộ sang Data Warehouse phải được xử lý bất đồng bộ.

Step 2

Chọn Mô hình Truyền tin (Hàng đợi vs. Pub/Sub)

Step 3

Xác định Cam kết Phân phối Tin nhắn

Step 4

Xử lý Sự cố (Thử lại & Dead Letter Queue)

Step 5

Kết nối Trải nghiệm Người dùng với Tính Nhất quán Tạm thời

Additional Tips

  • Idempotency là Mỏ neo: Vì hệ thống bất đồng bộ thường dùng cơ chế "gửi ít nhất 1 lần", lỗi mạng sẽ khiến tin nhắn bị gửi lại. Bạn phải khẳng định rằng mọi worker và API endpoint đều được thiết kế theo tính Lũy đẳng (xử lý cùng một sự kiện 2 lần sẽ không làm thay đổi kết quả cuối cùng).
  • Cạm bẫy Thứ tự Tin nhắn (Message Ordering): Đừng mặc định hàng đợi giữ đúng thứ tự tuyệt đối. Trong Kafka, thứ tự chỉ được đảm bảo trong cùng một partition (phân vùng), không phải toàn cục. Nếu thứ tự sự kiện là bắt buộc (VD: "Tạo tài khoản" phải đi trước "Cập nhật hồ sơ"), hãy giải thích cách bạn phân vùng dữ liệu (VD: phân vùng theo User_ID).
  • Cái giá của Khả năng Quan sát (Observability): Hãy thừa nhận sự phức tạp trong vận hành. Hệ thống bất đồng bộ cực kỳ khó debug vì một yêu cầu của người dùng sẽ phân tán qua nhiều hệ thống tách rời. Hãy nhấn mạnh sự cần thiết của Distributed Tracing (Truy vết phân tán như Jaeger) bằng cách đính kèm một trace_id duy nhất xuyên suốt toàn bộ vòng đời tin nhắn.