RabbitMQ¶
- Overview
- Features
- Message flow in RabbitMQ
- Types of Exchanges
Overview¶

-
RabbitMQlà một distributedMessage broker, có các đặc trưng nhưfast,scalable, vàdurable. RabbitMQ sử dụng giao thứcAMQP - Advanced Message Queue Protocol- một giao thức có dây (wire-protocol), có khả năng biểu diễn các message phù hợp với định dạng dữ liệu, vai trò giao thức trung gian cho việc truyền các gói tin trong Application Layer của mô hình OSI. -
RabbitMQđóng vai trò như một phần mềm trung gian trong việc trao đổi dữ liệu giữa cácprocess,application,systemhoặcservervới nhau. RabbitMQ sẽ nhậnmessageđến từ các thành phần khác nhau trong hệ thống, lưu trữ message an toàn rồi sau đó gửi message đến target. RabbitMQ có thể chạy trên nhiều OS, Cloud và cung cấp một loạt các công cụ dành cho nhà phát triển với hầu hết các ngôn ngữ phổ biến. -
Đây là một architecture cơ bản của message queue.:

-
Producer: là ứng dụng client, tạo message và publish tớibroker -
Broker- RabbitMQ: nhận message từProducer, message được đưa vàoExchangeđể định tuyến nó đến 0 hoặc nhiềuQueuedựa trên các ràng buộc (binding) và các khóa định tuyến (routing key). -
Consumer: là ứng dụng client khác, kết nối đếnqueue,subscribevàconsumemessage.
-
Features¶

-
Transparency: MộtProducerkhông cần phải biếtConsumer. Nó chỉ việc gửimessageđến cácqueuetrongMessage broker.Consumerchỉ việc đăng ký nhận message từ các queue này. -
Many Client: VìProducergiao tiếp vớiConsumertrung gian quaMessage brokernên dùProducervàConsumercó khác biệt nhau về ngôn ngữ thì giao tiếp này vẫn ok. Hiện nayRabbitMQđã hỗ trợ rất nhiều ngôn ngữ khác nhau. -
Asynchronous:Producerkhông cần biết khi nàomessageđến đượcConsumerhay khi nàomessageđượcConsumerxử lý xong. Đối vớiProducer, việc pushmessageđếnMessage brokerlà xong việc của nó.Consumersẽ pull cáimessagevề khi nó cần hoặc được RabbitMQ gửi cho nó tại một thời điểm cụ thể nào đó, gọi làtime acknowledgment. Đặc điểm này có thể được tận dụng để xây dựng các hệ thống lưu trữ và xử lý log. -
Flexible Routing:messageđược routing thông quaExchangetrước khi đếnQueue.RabbitMQcung cấp một số loạiExchangethường dùng và ta cũng có thể định nghĩa riêng Exhange để phù hợp với hệ thống của mình. -
Lightweight: Nhẹ, mộtsingle instancecủa RabbitMQ chỉ chiếm khoảng 40MB RAM. -
Multiple message protocol: AMQP, MQTT, STOMP, HTTP. -
Cluster: Ta có thể gom nhiềuRabbitMQ instancevào mộtCluster. Một q được định nghĩa trên mộtinstance, khi đó đều có thể truy xuất từ cácinstancecòn lại. Có thể tận dụng để làmload balancing. -
High availibilty: Đặc trưng nhất của một Message Broker -
Reliability: Có cơ chếACKnhư của mô hình client-server để đảm bảo message được nhận bởi Consumer đã được xử lý, và lưu trữ (persistence)message. -
Extensibility: Cung cấp hệ thống plugin linh hoạt, dễ dàng tích hợp các plugin của third party. Ví dụ: plugin lưu message vào cơ sở dữ liệu. -
Cloud: Dễ dàng triển khai với hạ tầng hiện có hoặc Cloud. -
Management & Monitoring: cung cấp HTTP API, command-line tool và UI để quản lý và giám sát. -
Tools support: Hoạt động với các công cụ CI/CD và có thể triển khai với BOSH, Chef, Docker và Puppet.
Related concepts¶
Ngoài các khái niệm đã đề cập như AMQP, Producer, Consumer, Queue, Message, ta còn có một số khái niệm cần biết trước khi tìm hiểu qua cơ chế hoạt động của RabbitMQ:
-
Connection: Một kết nối TCP giữa ứng dụng và RabbitMQ broker. -
Channel: Một kết nối ảo trong một Connection. Việc publishing hoặc consuming message từ một queue đều được thực hiện trên channel. -
Exchange: Là nơi nhận message được publish từ Producer và đẩy message vào Queue dựa vào quy tắc của từng loại Exchange. Để nhận được message, queue phải được nằm (binding) trong ít nhất 1 Exchange. -
Binding: là quy tắc (rule) mà Exchange sử dụng để định tuyến Message đến Queue. Đảm nhận nhiệm vụ liên kết giữa Exchange và 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. -
User: Để có thể truy cập vào RabbitMQ, chúng ta phải có username và password. Trong RabbitMQ, mỗi user được chỉ định với một quyền hạn nào đó. User có thể được phân quyền đặc biệt cho một Vhost nào đó. -
Virtual host/Vhost: Cung cấp những cách riêng biệt để các ứng dụng dùng chung một RabbitMQ instance. Những user khác nhau có thể có các quyền khác nhau đối với vhost khác nhau. Queue và Exchange có thể được tạo, vì vậy chúng chỉ tồn tại trong một vhost.
Message flow in RabbitMQ¶

-
Producer gửi message đến Broker và message được push thẳng vào Exchange.
-
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,type of Exchange. -
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.
-
Các Message nằm ở hàng đợi đến khi chúng được xử lý bởi một Consumer.
-
Consumer xử lý Message nhận từ Queue.
Types of Exchanges¶
Có 4 loại Exchange: Direct, Fanout, Topic, Headers. Việc lựa chọn các exchange type khác nhau sẽ dẫn đến các xử lý khác nhau của message broker với message nhận được từ producer. Exchange sẽ được binding đến một số Queue nhất định.
-
Direct Exchange: Tên mặc định là Empty string - Default Exchange hoặcamq.direct. Định tuyế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) và hữu ích khi muốn phân biệt các thông báo được publish cho cùng một exchange bằng cách sử dụng một mã định danh chuỗi đơn giản. -
Fanout Exchange-amq.fanout: Fanout exchange đị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. -
Topic Exchange- (Publish/Subscribe): 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 và pattern. Topic exchange thường sử dụng để thực hiện định tuyến thông điệp multicast. -
Headers Exchange: Header exchange được thiết kế để định tuyến với nhiều thuộc tính, để dàng thực hiện dưới dạng header của message hơn là routing key. Header exchange bỏ đi routing key mà thay vào đó định tuyến dựa trên header của message. Headers Exchange rất giống với Topic Exchange, nhưng nó định tuyến dựa trên các giá trị header thay vì routing key.
Ngoài Exchange type, Exchange còn định nghĩa một số thuộc tính:
Name: tên Exchange.Durability: thời gian tồn tại khi broker restartAuto-delete: Exchange sẽ bị xóa khi không còn Queue binding từ nó nữaArguments: Các tham số không bắt buộc, được sử dụng bởi các plugin và các tính năng dành riêng cho broker.