RabbitMQ là một message broker mã nguồn mở triển khai chuẩn AMQP 0-9-1. Nó đứng giữa các service để nhận, lưu tạm và định tuyến message — giúp các phần của hệ thống giao tiếp bất đồng bộ, tách rời nhau (decoupling). Bài này nắm vững các thành phần và luồng đi của một message.
RabbitMQ là một message broker: phần mềm trung gian nhận message từ bên gửi (producer/publisher) và chuyển tới bên nhận (consumer). Thay vì service A gọi trực tiếp service B, A chỉ cần "ném" message vào broker rồi quên đi; B lấy message ra xử lý khi rảnh. Nhờ vậy hai bên không cần online cùng lúc, không cần biết nhau, và có thể scale độc lập.
RabbitMQ nói "ngôn ngữ" AMQP (Advanced Message Queuing Protocol) — một giao thức nhị phân chuẩn hóa cách publish, route, lưu và nhận message. Đặc trưng của RabbitMQ là smart broker / dumb consumer: broker gánh phần logic định tuyến phức tạp, còn consumer chỉ việc nhận và xử lý.
Điểm dễ nhầm nhất với người mới: producer KHÔNG gửi thẳng vào queue. Producer luôn gửi message vào một exchange. Exchange căn cứ vào loại của nó cùng các binding và routing key để quyết định sao chép message vào (các) queue phù hợp. Consumer lắng nghe trên queue để nhận message.
| Thành phần | Vai trò |
|---|---|
| Connection | Kết nối TCP giữa ứng dụng và broker. Tốn kém, nên giữ lâu dài và dùng lại. |
| Channel | Kênh ảo (lightweight) chạy bên trong một connection. Mọi thao tác publish/consume đều qua channel — cho phép nhiều luồng dùng chung một connection TCP. |
| Exchange | Nơi producer gửi message vào. Định tuyến message tới queue dựa trên loại exchange + binding + routing key. |
| Queue | Bộ đệm (buffer) lưu message theo thứ tự FIFO cho tới khi consumer lấy ra. Là nơi message thực sự "nằm chờ". |
| Binding | Quy tắc liên kết exchange với queue, thường kèm một binding key, cho broker biết message nào chảy vào queue nào. |
| Message | Dữ liệu gửi đi: gồm body (payload, dạng byte) và properties/headers (routing key, delivery_mode, content_type...). |
| Consumer | Ứng dụng đăng ký nhận message từ queue và xử lý chúng. |
| Ack (acknowledgement) | Tín hiệu consumer báo "đã xử lý xong" để broker xóa message khỏi queue. Chưa ack thì broker giữ lại để giao lại nếu consumer chết. |
Cả hai đều xử lý message nhưng sinh ra cho mục đích khác nhau. Hiểu rõ điểm khác biệt giúp chọn đúng công cụ.
| Tiêu chí | RabbitMQ | Kafka |
|---|---|---|
| Mô hình | Smart broker / dumb consumer — broker lo định tuyến | Dumb broker / smart consumer — consumer tự quản offset |
| Lưu trữ | Xóa message sau khi đã ack (queue là buffer tạm) | Giữ message theo retention (vd 7 ngày) dù đã đọc |
| Thứ tự | FIFO trong một queue | Đảm bảo thứ tự trong từng partition |
| Replay | Không (message đã ack thì mất) | Có — đọc lại từ offset bất kỳ trong retention |
| Định tuyến | Rất linh hoạt qua exchange (direct/topic/fanout/headers) | Đơn giản theo topic/partition |
| Use case | Task queue, RPC, công việc nền, định tuyến phức tạp | Event streaming, log, pipeline dữ liệu lớn, replay |