Hãy tưởng tượng một cửa hàng trực tuyến nơi mỗi khi khách hàng đặt hàng, bạn cần phải:
- Xử lý thanh toán.
- Cập nhật kho hàng.
- Gửi email xác nhận.
Thực hiện tất cả những điều này ngay lập tức, đặc biệt trong thời gian cao điểm, có thể làm chậm trải nghiệm của khách hàng. Trong trường hợp này, chúng ta cần có một số lượng lớn sự kiện ứng dụng và không thể xử lý tất cả cùng một lúc.
Tất nhiên, chúng ta có thể mở rộng máy chủ để xử lý lượng lớn sự kiện ứng dụng này, nhưng nếu không cần xử lý tất cả cùng một lúc, tốt hơn là xếp hàng các sự kiện này và xử lý sau.
Kiến trúc cơ bản của Message Queue
Message Queue là một thành phần bền vững được lưu trữ trong bộ nhớ hỗ trợ giao tiếp không đồng bộ. Nó hoạt động như một bộ đệm và phân phối các yêu cầu không đồng bộ.
Kiến trúc cơ bản của một Message Queue rất đơn giản. Các dịch vụ đầu vào, gọi là nhà sản xuất hoặc nhà xuất bản, tạo và xuất bản thông điệp vào Message Queue. Các dịch vụ khác, gọi là nhà tiêu thụ hoặc người đăng ký, kết nối với hàng đợi và thực hiện các hành động được định nghĩa bởi Message.
Trong kịch bản thực tế, có thể có nhiều ứng dụng ghi vào hàng đợi và nhiều máy chủ đọc từ hàng đợi.
Quay lại ví dụ
Vì vậy, trong trường hợp của chúng ta, thay vì xử lý từng nhiệm vụ ngay lập tức, bạn có thể thêm nó vào cuối hàng đợi, và từ hàng đợi này, chúng được gửi đến máy chủ của chúng ta.
- Đặt hàng: Chi tiết đơn hàng được đưa vào một thông điệp (Message).
- Gửi Message: Thông điệp (Message) được thêm vào hàng đợi.
- Công nhân xử lý: Các quy trình riêng biệt (công nhân) kéo thông điệp (Message) từ đầu hàng đợi và xử lý các nhiệm vụ.
Ngoài ra, máy chủ của chúng ta xác nhận rằng nó đã nhận và xử lý một Message, và hàng đợi (Queue) loại bỏ nó để không gửi lần thứ hai.
Lợi ích của Việc Sử Dụng Message Queue
Lợi ích chính là chúng ta tách rời (decouple) các sự kiện này, và Message Queue cho phép chúng ta xử lý các sự kiện này không đồng bộ (asynchronously). Chúng ta có thể xếp hàng chúng cho đến khi có thể xử lý.
Với Message Queue, nhà sản xuất có thể đăng thông điệp (Message) vào hàng đợi khi người tiêu dùng không có sẵn để xử lý nó.
Ngoài ra, người tiêu thụ có thể đọc thông điệp (Message) từ hàng đợi (Queue) ngay cả khi nhà sản suất không có sẵn.
Một lợi ích tuyệt vời khác là chúng bền vững (durable). Nếu hàng đợi (Queue) bị lỗi, dữ liệu sẽ không bị mất vì nó không được lưu trữ trong RAM mà trong đĩa.
Nếu một công nhân bị lỗi khi xử lý một thông điệp (Message), không vấn đề gì! Thông điệp vẫn còn trong hàng đợi và sẽ được các công nhân khác nhặt lên.
Message Queue cũng cung cấp khả năng mở rộng. Nếu bạn nhận được một lượng lớn đơn đặt hàng, hàng đợi sẽ chỉ dài hơn. Bạn có thể thêm nhiều công nhân để xử lý tải thêm mà không ảnh hưởng đến trang web.
Các Loại Hàng Đợi Khác Nhau
Có nhiều loại Message Queue. Những loại phổ biến nhất là:
- FIFO (First-In-First-Out): Giống như một hàng đợi thông thường, các thông điệp (Message) được xử lý theo thứ tự chúng đến. Điều này quan trọng đối với những thứ như xử lý thanh toán.
- Hàng Đợi Ưu Tiên: Một số thông điệp (Message) có thể quan trọng hơn những thông điệp (Message) khác. Bạn có thể ưu tiên chúng để chúng được xử lý sớm hơn.
Đẩy (Push) vs Kéo (Pull)
Một số hàng đợi (Message Queue) chờ công nhân yêu cầu thông điệp (hàng đợi dựa trên kéo), trong khi những hàng đợi khác chủ động gửi thông điệp đến công nhân (hàng đợi dựa trên đẩy).
Ví dụ
Dưới đây là một số ví dụ phổ biến về Message Queue:
- RabbitMQ: Một hàng đợi (Queue) linh hoạt phù hợp cho nhiều trường hợp sử dụng.
- Kafka: Được xây dựng cho thông lượng cao và truyền dữ liệu thời gian thực. Tuyệt vời cho những thứ như ghi nhật ký và kiến trúc dựa trên sự kiện (event-driven architecture).
- Amazon SQS (Simple Queue Service): Một dịch vụ hàng đợi (Queue) dựa trên đám mây được quản lý hoàn toàn do AWS cung cấp. Nó có khả năng mở rộng và đáng tin cậy, với các tính năng như hàng đợi trễ (delay queue) và hàng đợi thư chết (dead-letter queue).
Nếu bạn muốn xem cách Message Queue có thể được sử dụng trong thực tế khi thiết kế các hệ thống phân tán lớn, hãy chắc chắn kiểm tra bài viết tiếp theo, nơi chúng ta thiết kế một hệ thống ứng dụng giống Twitter.
Tác giả: Hayk
Link bài gốc: Message Queues in System Design |hayksimonyan.substack.com| bài được đăng vào ngày 27/08/2024
Dịch giả: Hoàng Phan – KenkAI Nhiều thứ hay
(*) Bạn có thể sao chép và chia sẻ thoải mái.
(**) Follow KenkAI Nhiều thứ hay để đọc các bài dịch khác và cập nhật thông tin bổ ích hằng ngày.