RabbitMQ là gì?
- RabbitMQ là một message broker, triển khai giao thức AMQP (Advanced Message Queuing Protocol). Nhiệm vụ chính là tiếp nhận, lưu trữ tạm thời và chuyể n tiếp message giữa các Producer (gửi) và Consumer (nhận).
- Mục đích sử dụng RabbitMQ: phân tách các thành phần khác nhau trong hệ thống, xử lý bất đồng bộ, cân bằng tải các tác vụ và đảm bảo truyền tin tin cậy.
Các khái niệm chính RabbitMQ
- Broker: server RabbitMQ, là thành phần trung gian (middleware) giữa các ứng dụng hoặc dịch vụ, có nhiệm vụ nhận, lưu trữ tạm thời, định tuyến và chuyển tiếp các message từ producer đến consumer.
- Exchange: nơi Producer gửi message. Exchange quyết định route message đến queue bằng các rules. Có 4 loại Exchange phổ biến:
- Direct Exchange: gửi message đến queue dựa trên routing key chính xác. Producer khi publish message sẽ kèm một routing key. Queue nào được bind đến Exchange với cùng routing key thì sẽ nhận message. Thường dùng để phân loại theo tác vụ (info, warning, error,…) hoặc xử lý tác vụ cụ thể.
- Fanout Exchange: Broadcast message đến tất cả các queue bind vào nó, bỏ qua routing key. Thường dùng cho push notification, chat room, system notification.
- Topic Exchange: Dựa trên pattern của routing key (dùng * hoặc #). Routing key thể hiện dưới dạng chuỗi tách bởi dấu chấm. Thường dùng cho hệ thống logging phân cấp hoặc event system.
- *: một từ duy nhất. ví dụ: Queue A bind với
user.*
=> nhậnuser.create
,user.delete
nhưng không nhậnuser.profile.update
- #: 0 hoặc nhiều từ. Queue B bind với
user.#
=> nhận mọi thứ bắt đầu bằnguser.
(nhưuser.create
,user.profile.update
,user.login.mobile
).
- *: một từ duy nhất. ví dụ: Queue A bind với
- Headers Exchange: route message dựa vào header (thuộc tính), không dựa vào routing key. khi bind queue vào exchange, cần chỉ định 1 tập header key-value và chế độ x-match (any/all). Thường dùng khi cần route dựa trên nhiều thuộc tính meta, filter email,…
- Queue: nơi lưu message chờ consumer tiêu thụ.
- Binding: liên kết giữa Exchange và Queue (với Routing key).
- Routing key: key để map message từ exchange đến queue.
- Delivery Tag và Ack: Consumer phải ack message để broker biết đã xử lý thành công: nếu không ack, message có thể được request.
Ứng dụng RabbitMQ trong hệ thống backend API
- Xử lý background jobs/ task queues: gửi email, gửi SMS, push notification, xử lý file/ảnh, tạo PDF,… API nhận Request => push job vào queue => consumer lấy và xử lý.
- Buffering & smoothing traffic: khi lượng request API tăng đột biến, queue nhận hết các job, consumer scale dần để xử lý.
- Event-driven microservices: Service A publish event (order.created) → nhiều service subscribe (inventory, notification, accounting).
- Pub/Sub: Fanout/Topic Exchange gửi noti tới nhiều consumers (notifications, realtime update)
- Worker distribution: nhiều workers (consumers) cùng đọc từ một queue, giúp cân bằng tải RabbitMQ.
So sánh với các công nghệ tương tự
- Kafka: tốt cho event streaming, retention dài, throughput rất cao, consumer là stream processors. RabbitMQ thích hợp cho task queue, latency thấp, routing linh hoạt.
- Redis Stream: nhẹ, dễ triển khai, Kafka/RabbitMQ mạnh hơn khi cần routing mạnh/AMQP features.
- SQS/Cloud queues: managed, ít bận tâm vận hành nhưng thiếu tính năng routing đa dạng của RabbitMQ.