-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local

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ó:
- 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
- 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
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local