Triển khai không dễ dàng

Để thuyết phục được cả team dùng RabbitMQ đã khó rồi thì việc thuyết phục được dự án cho phép triển khai lại càng là một công việc gian nan. Làm gì thì làm chúng ta vẫn phải đảm bảo HA (High Availability), nghĩa là khả năng phục vụ 24/7

Các vấn đề đau đầu

Chỉ có một broker tại một thời điểm

Đúng vậy, chỉ có một broker được phép hoạt động tại một thời điểm, vì sao vậy? bạn hãy nhìn vào hình ở phía trên, nếu có 2 broker (giả sử là Broker A, Broker B) cùng hoạt động thì khi một consumer kết nối thông qua LB, nó sẽ có thể kết nối đến Broker A hoặc B, ở đây mình giả sử là Broker A. Lúc này 1 producer muốn gửi message đến consumer, nhưng producer này lại bị kết nối đến Broker B, vậy kết quả là producer và consumer mãi mãi không bao giờ kết nối được với nhau và queue tại Broker B bị đầy lên dẫn đến việc nó có thể bị die bất cứ lúc nào.

Health check RabbitMQ L4 hay L7?

Mình đã đọc các tài liệu của RabbitMQ thì chưa thấy cung cấp một API HTTP nào chuyển để health check, mà dùng tạm qua API GET /api/nodes/{node}/memory nhưng cơ bản là rất khó khăn nên với mình, mình sẽ lựa chọn L4 health check.

Những cách triển khai

Việc triển khai RabbitMQ tuỳ thuộc vào hạ tầng mà bạn đang có là gì, về cơ bản cần phải có:

  1. Load blalancer: yêu cầu cho thanh niên này là phải có cung cấp tính năng kiểm tra IP Failover để thông qua cơ chế VRRP (Virtual Router Redundancy Protocol) có thể đảm bảo chỉ có 1 Broker tại 1 thời điểm, ngoài ra LB này cũng phải cung cấp khả năng cân tải ở lớp 4 trong mô hình OSI
  2. Rabbit MQ Broker: Yêu cầu phải có tối thiểu 2 Broker luôn trong tình trạng active để đảm bảo Broker này die còn có Broker kia thay thế

Nhưng trong thực tế không phải lúc nào cũng màu hường như vậy, khi bọn mình triển khai thì LB của mình khá sơ khai, chỉ cung cấp mỗi tính năng là forward gói tin ở L7, vậy nên bọn mình buộc phải bổ sung thêm 2 server nginx để đáp ứng được yêu cầu, tuy nhiên điều này làm tăng chi phí vận hành lên rất nhiều và hiệu năng cũng bị giảm đi nữa.

Tổng kết

Nhìn chung là việc áp dụng RabbitMQ là rất hay ho, đơn giản, nhưng để triển khai và vận hành được một hệ thống là không hề dễ chịu, đòi hỏi phải có nhiều server và các kỹ thuật cao, vậy đây cũng là điểm chúng ta cần cân nhắc khi thiết kế hệ thống nhé.

Tham khảo

  1. OSI
  2. Rabbit Monitoring
  3. Nginx HA
  4. Virtual Router Redundancy Protocol