Hãy tưởng tượng một cửa hàng trực tuyến mà mỗi khi có khách hàng đặt hàng, hệ thống phải thực hiện nhiều tác vụ cùng lúc như:
- Xử lý thanh toán.
- Cập nhật hàng tồn kho.
- Gửi email xác nhận.
Nếu xử lý tất cả các tác vụ này ngay lập tức – đặc biệt vào giờ cao điểm – trải nghiệm của khách hàng có thể bị ảnh hưởng nghiêm trọng do hệ thống trở nên chậm chạp. Giải pháp hiệu quả trong trường hợp này là hàng đợi tin nhắn.

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 chúng ta không phải xử lý tất cả cùng một lúc, tốt hơn là nên xếp hàng các sự kiện này và xử lý sau.
Hàng Đợi Tin Nhắn Là Gì?
Hàng đợi tin nhắn là một thành phần bền vững được lưu trữ trên bộ nhớ (nhưng không chỉ trong RAM mà còn trên đĩa) hỗ trợ giao tiếp không đồng bộ giữa các dịch vụ. Nó hoạt động như một bộ đệm, lưu trữ các tin nhắn và phân phối các yêu cầu không đồng bộ đến các công nhân (workers) xử lý sau đó.
Trong kiến trúc này, có hai vai trò chính:
- Nhà sản xuất (Producer/Publisher): Các dịch vụ tạo ra và xuất bản tin nhắn lên hàng đợi.
- Người tiêu dùng (Consumer/Subscriber): Các dịch vụ kết nối đến hàng đợi và thực hiện các hành động được xác định bởi nội dung tin nhắn.

Trong 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 tôi, thay vì xử lý từng tác vụ ngay lập tức, bạn có thể thêm tác vụ đó vào cuối hàng đợi và từ hàng đợi này, chúng sẽ được gửi đến máy chủ của chúng tôi.
- Đơn hàng đã đặt: Khi khách hàng mua hàng, chi tiết đơn hàng được chuyển thành tin nhắn.
- Tin nhắn được gửi: Tin nhắn này được thêm vào cuối hàng đợi.
- Quy trình công nhân: Các quy trình riêng biệt (các công nhân) lấy tin nhắn từ phía trước hàng đợi và xử lý các tác vụ như thanh toán, cập nhật kho, hay gửi email.

Ngoài ra, máy chủ của chúng tôi xác nhận rằng nó đã nhận và xử lý một tin nhắn và hàng đợi sẽ xóa tin nhắn đó để tin nhắn đó không được gửi lần thứ hai để tránh việc xử lý lặp lại.

Lợi ích của việc sử dụng Message Queues
Ưu điểm chính là chúng ta tách rời các sự kiện này và Message Queues này sẽ cho phép chúng ta xử lý các sự kiện này một cách không đồng bộ. Chúng ta có thể xếp hàng chúng cho đến khi chúng ta có thể xử lý chúng.
Với Message Queues, nhà sản xuất có thể đăng tin nhắn vào hàng đợi khi người tiêu dùng không có mặt để xử lý tin nhắn đó.

Ngoài ra, người dùng có thể đọc tin nhắn từ hàng đợi ngay cả khi người tạo không có mặt.

Một lợi ích tuyệt vời khác là chúng bền . Nếu hàng đợi bị sập, 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 Producer gặp sự cố khi xử lý tin nhắn, không vấn đề gì! Tin nhắn vẫn nằm trong hàng đợi và sẽ được một Producer khác tiếp nhận.

Message Queues cũng cung cấp khả năng mở rộng . Nếu bạn nhận được một loạt lệnh, hàng đợi sẽ dài hơn. Bạn có thể thêm nhiều nhân viên hơn để xử lý tải bổ sung mà không ảnh hưởng đến trang web.
Các loại hàng đợi khác nhau
Có nhiều loại hàng đợi tin nhắn. Những loại phổ biến nhất là:
- FIFO (First-In-First-Out): Giống như một dòng thông thường, tin nhắn đượ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ố tin nhắn có thể quan trọng hơn những tin nhắn khác. Bạn có thể ưu tiên những tin nhắn này để chúng được xử lý sớm hơn.

Push và Pull
Một số hàng đợi chờ người lao động yêu cầu tin nhắn ( queues pull ), trong khi những hàng đợi khác chủ động gửi tin nhắn cho người lao động ( queues push ).

Ví dụ
Sau đây là một số ví dụ phổ biến về hàng đợi tin nhắn:

- RabbitMQ: Một hàng đợi đa năng phù hợp cho nhiều trường hợp sử dụng.
- Kafka: Được xây dựng để truyền dữ liệu thông lượng cao và thời gian thực. Tuyệt vời cho những thứ như ghi nhật ký và kiến trúc hướng sự kiện.
- Amazon SQS (Simple Queue Service): Một dịch vụ hàng đợi đám mây được quản lý hoàn toàn do AWS cung cấp. Dịch vụ này 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ễ và hàng đợi dead-letter.
Kết Luận
Việc sử dụng hàng đợi tin nhắn mang lại nhiều lợi ích thiết thực cho các ứng dụng trực tuyến, đặc biệt là trong môi trường có tải cao và yêu cầu xử lý bất đồng bộ. Bằng cách tách rời các sự kiện và cho phép xử lý theo thứ tự ưu tiên, hệ thống không chỉ đảm bảo hiệu năng mà còn tăng cường độ bền và khả năng mở rộng. Dù bạn đang xây dựng một cửa hàng trực tuyến hay một hệ thống phức tạp khác, hàng đợi tin nhắn là một giải pháp tuyệt vời để tối ưu hóa quy trình xử lý và cải thiện trải nghiệm của khách hàng.
Hy vọng bài viết này đã cung cấp cho bạn cái nhìn tổng quan về hàng đợi tin nhắn cũng như lợi ích của nó trong việc xây dựng một hệ thống mạnh mẽ và linh hoạt. Bạn đã sẵn sàng áp dụng công nghệ này vào dự án của mình chưa?
Nguồn: https://levelup.gitconnected.com/message-queues-in-system-design-0440a1221023