RabbitMQ có ba chế độ triển khai chính:
1. Chế độ đơn lẻ
Chỉ chạy một phiên bản RabbitMQ trên một máy chủ. Đây là cấu hình đơn giản nhất, không cung cấp khả năng chịu lỗi hoặc khả năng mở rộng.
version: '3.1'
services:
rabbitmq:
restart: always
image: rabbitmq:management
container_name: rabbitmq
ports:
- 5672:5672
- 15672:15672
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: 123456
volumes:
- ./data:/var/lib/rabbitmq
2. Chế độ chùm thông thường (Clustered Mode)
Trong chế độ này, nhiều nút RabbitMQ hoạt động cùng nhau để tạo thành một cụm. Tuy nhiên, trong cấu hình mặc định, mỗi hàng đợi (queue) chỉ tồn tại trên một nút duy nhất. Các nút khác trong cụm chỉ lưu trữ siêu dữ liệu (metadata) của hàng đợi. Khi một tin nhắn được gửi đến một nút và được tiêu thụ từ một nút khác, RabbitMQ sẽ thực hiện truyền tin nhắn tạm thời giữa các nút. Để tận dụng hiệu quả, các ứng dụng tiêu thụ (consumer) nên kết nối tới tất cả các nút trong cụm để lấy tin nhắn. Nếu không, có thể xảy ra điểm nghẽn hoặc mất mát tin nhắn nếu nút chứa dữ liệu hàng đợi gặp sự cố.
Để thiết lập chế độ chùm thông thường:
- Đảm bảo giá trị của tệp `.erlang.cookie` giống nhau trên tất cả các nút trong cụm.
- Đảm bảo các máy chủ có thể giao tiếp với nhau (ví dụ: `ping` thành công).
Ví dụ cấu hình với hai nút `rabbit01` và `rabbit02` sử dụng Docker Compose:
# docker-compose.yml cho nút 1
version: '3.1'
services:
myrabbit01:
restart: always
image: rabbitmq:management
container_name: myrabbit01
ports:
- 5672:5672
- 15672:15672
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: 123456
RABBITMQ_ERLANG_COOKIE: mysecretcookie
volumes:
- ./data01:/var/lib/rabbitmq
hostname:
rabbit01
network_mode: bridge
# docker-compose.yml cho nút 2
version: '3.1'
services:
myrabbit02:
restart: always
image: rabbitmq:management
container_name: myrabbit02
ports:
- 5673:5672
- 15673:15672
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: 123456
RABBITMQ_ERLANG_COOKIE: mysecretcookie
volumes:
- ./data02:/var/lib/rabbitmq
extra_hosts:
- rabbit01 myrabbit01:172.17.0.2 # Thay thế bằng IP thực tế của myrabbit01
hostname:
rabbit02
network_mode: bridge
Sau khi khởi chạy các container, tham gia cụm:
# Trên container myrabbit02
docker exec -it myrabbit02 bash
rabbitmqctl stop_app
rabbitmqctl reset
# Tham gia cụm với nút rabbit01 (có thể là nút RAM hoặc DISK)
rabbitmqctl join_cluster --ram rabbit@rabbit01
rabbitmqctl start_app
exit
Cấu hình ứng dụng Spring Boot để kết nối tới các địa chỉ của cụm:
spring:
application:
name: spring-boot-amqp
rabbitmq:
username: admin
password: 123456
addresses: 192.168.1.100:5673,192.168.1.100:5672 # Thay thế bằng IP và port của các nút
Lưu ý: Chế độ chùm thông thường không cung cấp tính sẵn sàng cao thực sự. Nếu nút chính chứa dữ liệu hàng đợi bị lỗi, tin nhắn có thể không khả dụng cho đến khi nút đó phục hồi hoặc có thể bị mất nếu không được lưu trữ bền vững.
3. Chế độ nhân bản (Mirrored Mode)
Chế độ nhân bản giải quyết vấn đề sẵn sàng cao của chế độ chùm thông thường bằng cách tạo ra các bản sao của hàng đợi trên nhiều nút. Điều này đảm bảo rằng dữ liệu hàng đợi có sẵn ngay cả khi một nút bị lỗi. Tuy nhiên, việc sao chép dữ liệu liên tục giữa các nút có thể làm giảm hiệu suất hệ thống và tiêu tốn băng thông mạng.
Chế độ nhân bản yêu cầu cấu hình chính sách (policy). Chính sách này xác định những hàng đợi hoặc exchange nào cần được nhân bản và cách thức nhân bản.
Ví dụ cấu hình chính sách để nhân bản tất cả các hàng đợi:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
- `ha-all`: Tên của chính sách.
- `"^"`: Biểu thức chính quy để khớp tên của exchange hoặc queue (ở đây là tất cả).
- `{"ha-mode":"all"}`: Cấu hình chế độ nhân bản. Các tùy chọn cho `ha-mode` bao gồm:
- `all`: Nhân bản hàng đợi trên tất cả các nút trong cụm.
- `exactly`: Nhân bản trên một số lượng nút xác định (cần cấu hình `ha-params`).
- `nodes`: Nhân bản trên các nút được chỉ định (cần cấu hình `ha-params`).
Chế độ nhân bản phù hợp cho các ứng dụng yêu cầu tính sẵn sàng rất cao.
Tóm lại, trong môi trường đám mây hiện đại, chế độ chùm thông thường thường đủ dùng cho hầu hết các trường hợp. Chế độ nhân bản nên được cân nhắc khi yêu cầu về tính sẵn sàng là cực kỳ quan trọng.