1. Khái niệm
- RabbitMQ là gì? RabbitMQ là một Message Broker sử dụng giao thức AMQP để phục vụ cho hoạt động trao đổi tin nhắn giữa các ứng dụng với nhau. RabbitMQ được hiểu như một người vận chuyển các message và quản lý những tin nhắn trên hàng đợi.
- RabbitMQ sử dụng ngôn ngữ lập trình Erlang.
2. Tại sao sử dụng RabbitMQ?
- Ví dụ 1: Hãy tưởng tượng, hiện bạn đang có một web service, phải nhận rất rất nhiều request mỗi giây, mà lại phải đảm bảo rằng không có bất cứ một request nào bị mất. Và web service của bạn luôn luôn sẵn sàng tiếp nhận request mới thay vì locked bởi đang xử lí request trước đó. Vậy ý tưởng ở đây là đặt chúng vào một queue giữa web service và processing service. Lúc này sẽ đảm bảo rằng 2 process sẽ hoàn toàn tách rời nhau. Ngoài ra, queue sẽ lưu trữ những request, không bị thiếu sót request nào khi số lượng của chúng trở nên vô cùng lớn.
- Ví dụ 2: Giả sử chúng ta có một web application cho phép user đăng ký thông tin. Sau khi đăng ký, hệ thống sẽ xử lý thông tin, generate PDF và gửi email lại user. Những công việc này hệ thống cần nhiều thời gian để xử lý, chẳng hạn. Nếu xử lý theo cách thông thường thì user sẽ phải chờ đến khi hệ thống xử lý hoàn thành, và nếu hệ thống có hàng nghìn user truy cập cùng lúc sẽ gây quá tải server.
- Đối với những loại công việc thế này, chúng ta sẽ xử lý nó bằng cách sử dụng message queue: Sau khi user nhập đầy đủ các thông tin trên web interface, web application sẽ tạo một Message “Generate PDF” chứa đầy đủ thông tin cần thiết và gửi nó vào Queue của RabbitMQ.
3. Kiến trúc của RabbitMQ
Đây là một architecture cơ bản của message queue.
- Producer : là ứng dụng client, tạo message và publish tới broker.
- Consumer : là ứng dụng client khác, kết nối đến queue, subscribe (đăng ký) và xử lý (consume) message.
- Broker (RabbitMQ) : nhận message từ Producer, lưu trữ chúng an toàn trước khi được lấy từ Consumer.
Flow đầy đủ sử dụng RabbitMQ để giải quyết vấn đề trên:
- (1) User gửi yêu cầu tạo PDF đến web application.
- (2) Web application (Producer) gửi tin nhắn đến RabbitMQ bao gồm dữ liệu từ request như tên và email.
- (3) Một Exchange chấp nhận các tin nhắn từ Producer và định tuyến chúng đến Queue (hàng đợi) để tạo PDF.
- (4) Ứng dụng xử lý PDF (Consumer) nhận Message từ Queue và bắt đầu xử lý PDF.
4. Lợi ích của RabbitMQ
- Asynchronous Messaging: Producer không thể biết khi nào message đến được consumer hay khi nào message được consumer xử lý xong. Đối với producer, đẩy message đến message broker là xong việc. Consumer sẽ lấy message về khi nó muốn.
- Many Client: Vì producer giao tiếp với consumer trung gian qua message broker nên dù producer và consumer có khác biệt nhau về ngôn ngữ thì giao tiếp vẫn thành công. Hiện nay rabbitmq đã hỗ trợ rất nhiều ngôn ngữ khác nhau.
- Cloud: dễ dàng triển khai trên Cloud.
5. Bất lợi của RabbitMQ
- Sẽ gặp nhiều vấn đề nếu xử lý massive data
- Không xử lý được thông lượng lớn (1 million message/s)
6. Những khái niệm cơ bản trong RabbitMQ
- Producer: Ứng dụng/ chương trình gửi message.
- Consumer: Ứng dụng/ chương trình nhận message.
- Queue: Hoạt động lưu trữ các message.
- Message: tin nhắn là thông tin được Producer truyền đến Consumer thông qua message broker.
- Connection: là kết nối TCP giữa ứng dụng/ chương trình và message broker.
- Channel: là kết nối ảo trong một Connection là môi trường để thực hiện các hoạt động như publishing, consuming message từ queue.
- Exchange: Là nơi nhận message được publish từ Producer và đẩy chúng vào queue dựa vào quy tắc của từng loại Exchange. Sẽ phân tích rõ hơn ở phần sau.
- Binding: là quy tắc – rule, Exchange có nhiệm vụ liên kết và routing message đến queue.
- Routing key: Một key mà Exchange dựa vào đó để quyết định cách để định tuyến message đến queue. Có thể hiểu nôm na, Routing key là địa chỉ dành cho message.
- AMQP – Advanced Message Queuing Protocol: là một giao thức (protocol) truyền message được sử dụng trong RabbitMQ.
- User: hay người dùng, mỗi người dùng sẽ có tài khoản, mật khẩu khác nhau và những quyền hạn nhất định được phân cụ thể trong RabbitMQ.
- Virtual host hay viết tắt là Vhost: hay máy chủ ảo, là một phương thức cho phép lưu trữ các ứng dụng khác nhau dùng chung RabbitMQ instance. User khác nhau sẽ có quyền khác nhau với các Vhost; Queue và Exchange sẽ chỉ tồn tại trong một Vhost.
RabbitMQ hoạt động như thế nào?
- (1) Producer đẩy message vào Exchange. Khi tạo Exchange, bạn phải mô tả nó thuộc loại gì. Các loại Exchange sẽ được giải thích phía dưới.
- (2) Sau khi Exchange nhận Message, nó chịu trách nhiệm định tuyến message. Exchange sẽ chịu trách nhiệm về các thuộc tính của Message, ví dụ routing key, loại Exchange.
- (3) Việc binding phải được tạo từ Exchange đến Queue (hàng đợi). Trong trường hợp này, ta sẽ có hai binding đến hai hàng đợi khác nhau từ một Exchange. Exchange sẽ định tuyến Message vào các hàng đợi dựa trên thuộc tính của của từng Message.
- (4) Các Message nằm ở hàng đợi đến khi chúng được xử lý bởi một Consumer.
- 5) Consumer xử lý Message nhận từ Queue.
7. Exchange và các loại Exchange
A. Direct Exchange
Direct Exchange vận chuyển message đến queue dựa vào routing key. Thường được sử dụng cho việc định tuyến tin nhắn unicast-đơn hướng (mặc dù nó có thể sử dụng cho định tuyến multicast-đa hướng). Các bước định tuyến message:
- Một queue được ràng buộc với một direct exchange bởi một routing key K.
- Khi có một message mới với routing key R đến direct exchange. Message sẽ được chuyển tới queue đó nếu R=K.
B. Default Exchange
Mỗi một exchange đều được đặt một tên không trùng nhau, default exchange bản chất là một direct exchange nhưng không có tên (string rỗng). Nó có một thuộc tính đặc biệt làm cho nó rất hữu ích cho các ứng dụng đơn giản: mọi queue được tạo sẽ tự động được liên kết với nó bằng một routing key giống như tên queue.
Ví dụ, nếu bạn tạo ra 1 queue với tên “hello-world”, RabbitMQ broker sẽ tự động binding default exchange đến queue “hello-word” với routing key “hello-world”.
C. Fanout Exchange
Fanout exchange (định tuyến broadcast – amq.fanout) định tuyến message (copy message) tới tất cả queue mà nó được bind, với bất kể một routing key nào. Giả sử, nếu nó N queue được bind bởi một Fanout exchange, khi một message mới published, exchange sẽ định tuyến message đó tới tất cả N queues. Fanout exchange được sử dụng cho định tuyến message broadcast (quảng bá).
Flow của một Message trong Fanout Exchange như sau:
- Một Producer sẽ tạo một Message và publish tới Exchange.
- Một hoặc nhiều Queue bind tới Fanout Exchange không cần thông tin routing key.
- Một Message tới Exchange sẽ được chuyển tiếp đến tất cả các Queue mà không có bất kỳ điều kiện kiểm tra nào.
Exchange Fanout hữu ích với trường hợp ta cần một dữ liệu được gửi tới nhiều ứng dụng khác nhau với cùng một message nhưng cách xử lý ở mỗi ứng dụng là khác nhau.
Ví dụ về Fanout Exchange : https://gpcoder.com/6928-su-dung-fanout-exchange-trong-rabbitmq/
D. Topic Exchange
Topic exchange định tuyến message tới một hoặc nhiều queue dựa trên sự trùng khớp giữa routing key pattern
Flow của một Message trong Topic Exchange như sau:
- Một Queue được tạo và binding tới một Topic Exchange với một routing key pattern (P).
- Một Producer sẽ tạo một Message với một routing key (K) và publish tới Exchange.
- Một Message được Exchange chuyển đến Queue nếu Pattern P match với Key K.
- Consumer đăng ký tới Queue để nhận Message.
Ví dụ về Topic Exchange: https://topdev.vn/blog/su-dung-topic-exchange-publish-subscribe-trong-rabbitmq/