

Message Queue là hàng đợi tin nhắn, một hình thức giao tiếp bất đồng bộ giữa các dịch vụ trong kiến trúc microservices và serverless. Tin nhắn được lưu trên hàng đợi cho đến khi được xử lý, mỗi tin chỉ được xử lý một lần bởi một consumer theo mô hình point-to-point. Đây là thành phần không thể thiếu trong các hệ thống phân tán hiện đại.
Message queue là gì?
Trong mô hình message queue, một producer gửi tin nhắn vào hàng đợi, sau đó consumer lấy ra và xử lý. Khi một tin cần nhiều consumer cùng nhận, hệ thống kết hợp thêm cơ chế pub/sub (publish-subscribe) để phát tán. Hàng đợi hoạt động như một vùng đệm trung gian, giúp các thành phần trong hệ thống không cần liên lạc trực tiếp với nhau. Theo AWS, đây là nền tảng của kiến trúc hướng sự kiện và microservices.
Vì sao cần message queue?
Decoupling — tách rời các dịch vụ
Producer và consumer không cần biết về nhau, chỉ cần giao tiếp qua hàng đợi. Nhờ đó, các dịch vụ có thể phát triển, triển khai và bảo trì độc lập. Một thay đổi ở dịch vụ gửi tin không ảnh hưởng tới dịch vụ nhận tin.
Buffering — đệm tải bùng nổ
Khi hệ thống nhận lưu lượng tăng đột biến, ví dụ chiến dịch khuyến mãi, hàng đợi hấp thụ lượng tin nhắn lớn và giải phóng dần. Consumer xử lý theo khả năng của mình, tránh quá tải và sập hệ thống.
Async — xử lý bất đồng bộ
Producer không phải chờ consumer xử lý xong. Các tác vụ nặng như xử lý video, gửi email hàng loạt hay phân tích dữ liệu được đưa vào hàng đợi và xử lý nền, giúp API phản hồi nhanh hơn rất nhiều.
Khái niệm cốt lõi
- Producer: ứng dụng gửi tin nhắn vào hàng đợi.
- Consumer: ứng dụng nhận và xử lý tin nhắn.
- Broker: trung gian nhận, lưu trữ và định tuyến tin nhắn.
- Queue: cấu trúc FIFO chứa tin nhắn chờ xử lý.
- Exchange: trong RabbitMQ, bộ định tuyến phân phối tin vào queue theo binding rules.
- Topic/Partition: trong Kafka, topic là luồng record có tên, partition là chuỗi record có thứ tự bất biến.
Chi tiết về mô hình AMQP của RabbitMQ có thể xem tại tài liệu chính thức RabbitMQ.
RabbitMQ: thông điệp trung gian cổ điển
RabbitMQ là message-oriented middleware mã nguồn mở, triển khai giao thức AMQP 0-9-1, viết bằng Erlang, ra đời từ năm 2007. Nó hoạt động theo mô hình smart broker / dumb consumer: broker quản lý việc giao tin, push tin đến consumer với độ trễ thấp.
Routing linh hoạt với 4 loại exchange: direct, fanout, topic và headers. RabbitMQ hỗ trợ priority queue, TTL và dead letter queue, rất phù hợp cho task queue, xử lý nền và giao tiếp giữa microservices với routing phức tạp. Tuy nhiên, throughput thấp hơn Kafka do không batching và xử lý từng tin một; tin bị xóa sau khi delivered; scale theo chiều dọc.
Kafka: nền tảng event streaming
Apache Kafka là event streaming platform phân tán, khởi nguồn tại LinkedIn năm 2010, open source từ 2011 và trở thành dự án Apache từ 2012. Kafka xử lý hàng triệu tin mỗi giây, cluster có thể mở rộng tới khoảng 1000 broker với petabytes dữ liệu mỗi ngày và độ trễ khoảng 2ms.
Khác với RabbitMQ, Kafka lưu trữ tin nhắn bền vững trên disk theo log-based model. Consumer tự quản lý offset và có thể replay lại dữ liệu cũ. Retention dựa trên thời gian hoặc kích thước. Kafka scale theo chiều ngang — thêm máy thay vì nâng cấp phần cứng. Chi tiết tại What is Apache Kafka.
So sánh RabbitMQ và Kafka
| Tiêu chí | RabbitMQ | Kafka |
|---|---|---|
| Giao thức | AMQP | Log-based, TCP riêng |
| Ngôn ngữ | Erlang | Java/Scala |
| Lưu trữ tin | Xóa sau khi delivered | Bền vững, có retention |
| Scale | Theo chiều dọc | Theo chiều ngang |
| Throughput | Trung bình | Hàng triệu tin/giây |
| Use case | Task queue, xử lý nền | Streaming pipeline, analytics |
Khi nào chọn công cụ nào?
Chọn RabbitMQ khi cần task queue, xử lý nền dài hạn như gửi email, xử lý upload file, batch job theo lịch, hoặc giao tiếp microservices với routing phức tạp và yêu cầu độ trễ thấp. Chọn Kafka khi cần data pipeline streaming, xử lý realtime, streaming ETL, log aggregation, lượng dữ liệu khổng lồ và khả năng replay dữ liệu.
Quy tắc ngắn gọn theo Confluent: messaging nhẹ với routing phức tạp dùng RabbitMQ; high throughput, scale lớn và cần lưu trữ dữ liệu dùng Kafka. Nhiều hệ thống lớn thực tế dùng cả hai: Kafka cho streaming throughput cao, queue truyền thống cho task distribution.
Kết luận
Message queue là kỹ năng nền tảng của lập trình backend hiện đại. Bắt đầu với RabbitMQ để hiểu mô hình queue, sau đó tìm hiểu Kafka khi hệ thống cần scale lớn. Cả hai đều có tài liệu phong phú và cộng đồng lớn, giúp bạn xây dựng hệ thống phân tán vững chắc hơn.
Tham khảo thêm:
