Tìm hiểu cơ bản về RabbitMQ

I. Tổng Quan

RabbitMQ là một hệ thống hàng đợi tin nhắn (message broker) thường được sử dụng để xử lý công việc bất đồng bộ. Nó giúp truyền và phân phối các tin nhắn (message) giữa các ứng dụng hoặc service thông qua các hàng đợi (queues). Trong bài viết này mình sẽ tìm hiểu cơ bản về RabbitMQ vesion 3.13.7

II. Các thành phần chính

1. Producer

Có thể hiểu là ứng dụng hoặc serivce, service sẽ gửi message đến hệ thống RabbitMQ

2. Consumer

Consumer cũng giống như producer là ứng dụng hoặc service nhưng service này sẽ nhận message từ hệ thống RabbitMQ và xử lý message.

3. Broker

Trong RabbitMQ Broker đóng vai trò là thành phần trung gian chịu trách nhiệm nhận và gửi message giữa Producer và Consumer. Broker sẽ quản lý việc việc định tuyến, lưu trữ và phân phối message theo các quy tắc như Exchange, Routing Key, Binding…

4. Connection

Là một kết nối TCP(Transmission Control Protocol) giữa client và RabbitMQ Broker. Client ở đây có thể là producer hoặc consumer

5. Channel

Là một kết nối ảo trong connection TCP giữa client và RabbitMQ. Channel thực hiện các actions như gửi và nhận message, tạo exchange, queue và binding

6. Routing Key

Routing key là một chuỗi mà Producer đính kèm vào mỗi message nó giúp exchange xác định các queues sẽ nhận message thông qua các binding

7. Exchange

Trong hệ thống RabbitMQ, exchange đóng vai trò nhận message và xác định các queue nào sẽ nhận được message theo từng rules exchange. Có 4 loại exchange bao gồm Direct, Topic, Fanout, Headers. Chúng ta cùng tìm hiểu qua về cách hoạt động của từng loại Exchange:

– Direct: Direct exchange sẽ xác định các queues nhận message dựa trên routing key.

– Topic: Topic exchange sẽ xác định các queues nhận message dựa trên sự trùng khớp giữa routing key và pattern. Ví dụ pattern là “demo.*.#” thì key demo.e hoặc demo.e.e đều phù hợp, sẽ có nhiều key khác cũng phù hợp với pattern này đây chỉ là 2 key ví dụ. Dưới đây là mô tả Wildcard (ký tự đại diện) được sử dụng:

+ ( * ) có nghĩa là chính xác một từ được phép

+ ( # ) có nghĩa là số lượng từ được phép bằng không hoặc nhiều hơn

+ ( . ) Có nghĩa là dấu phân cách từ

– Fanout: Đối với Fanout exchange tất cả các queue mà nó binding sẽ nhận message

– Headers: Headers exchange sẽ xác định các queues nhận message dựa vào các giá trị trong header

8. Binding

Trong RabbitMQ Binding đóng vai trò liên kết giũa exchange và queue, nó xác định xem message nào sẽ được chuyển từ exchange sang queue thông qua routing key hoặc các pattern của từng loại exchange nếu có.

9. Queue

Đây là nơi lưu trữ các message, mỗi queue thường sẽ chứa 1 hoặc nhiều message và nó có thể nhận được message từ nhiều loại exchange khác nhau do một queue có thể được binding với nhiều exchange khác nhau.

10. User

Là tải khoản người dùng, dùng để truy cập và quản lý RabbitMQ. Ta có thể phân quyền người dùng đối với các tài nguyên và actions.

11. Virtual Host (vhost)

Trong RabbitMQ ta thường dùng để tổ chức và phân chia môi trường tài nguyên như exchanges, queues, bindings

12. Giao thức

Trong RabbitMQ hỗ trợ khá nhiều giao thức khác nhau. Trong các giao thức mà RabbitMQ cung cấp thì có một số giao thức bao gồm SSL/TLS hỗ trợ cho việc bảo mật. Mình sẽ mô tả một số giao thức của RabbitMQ mà chúng ta thường dùng như AMQP hay HTTP/HTTPS.

– Giao thức AMQP(Advanced Message Queuing Protocol) sử dụng port 5672 đây là giao thức mà RabbitMQ dùng để gửi và nhận message.

– Giao thức AMQP(Advanced Message Queuing Protocol) qua SSL/TLS sử dụng port 5671 đây là giao thức mà RabbitMQ dùng để gửi và nhận message.

– Giao thức HTTP/HTTPS sử dụng port 15672 và 15671 trong đó:

+ Port 15672: Giao thức mặc định HTTP ta có thể cấu hình để sử dụng HTTPS đây là giao thức mà RabbitMQ dùng cho HTTP API clients và giao diện quản lý.

+ Port 15671: Giao thức HTTPS đây là giao thức mà RabbitMQ dùng cho HTTP API clients và giao diện quản lý.

Nếu bạn muốn sử dụng trang web quản lý bạn cần enable plugin Management Plugin với câu lệnh “rabbitmq-plugins enable rabbitmq_management”.

III Ưu diểm & Hạn chế

1. Ưu điểm

– Độ tin cây: RabbitMQ cung cấp nhiều cơ chế đảm bảo message không bị mất như lưu trữ trên đĩa, xác nhận message, rollback nếu có lỗi.

– Linh hoạt: Hỗ trợ nhiều giao thức và mô hình phân phối message

– Quán lý và giám sát: RabbitMQ cung cấp nhiều plugin tích hợp với công cụ giam sát trong đó có giao diện quản lý web giúp ta dễ sử dụng và theo dõi quản lý tài nguyên, người dùng…

– Khả năng mở rộng: RabbitMQ cung cấp nhiều cơ chế để mở rộng và đáp ứng nhu cầu hệ thống quy mô lớn, phân tán…

2. Hạn chế

– Cấu hình: Để cấu hình RabbitMQ chính xác thì khá phức tạp do kiến thức khá nhiều

– Hiệu suất: Hạn chế về độ trễ khi có khối lượng message lớn. Độ trễ ở đây có thể hiểu là thời gian xử lý, lưu trữ message vào các queues… Mình research thì cũng có khá nhiều cách để cải thiện nhưng đa phần là cần $ =))

– Tài nguyên: RabbitMQ sẽ tốn khá nhiều tài nguyên để hoạt động tốt trong các trường hợp nhiều kết nối hoặc xử lý nhiều actions. Tài nguyên ở đây là RAM(bộ nhớ), CPU và ROM(bộ nhớ disk). Do RabbitMQ sử dụng RAM để lưu trữ tin message tạm thời và các connections, còn ROM thì sử dụng lưu trữ log, metadata và có cơ chế lưu message để đảm bảo message không bị mất sau khi gặp sự cố. CPU thì hầu hết các actions trong RabbitMQ đều cần CPU

IV. Ví dụ vận chuyển message trong RabbitMQ

Trên hình các bạn có thể thấy các thành phần chính là: Producer, Broker, Exchange, Binding, Queue, Consumer. Nhưng để Producer và Consumer kết nối được đến Broker chúng ta sẽ cần thông tin User. Trên hình ảnh chúng ta cũng không thấy được Channel. Mình sẽ mô tả như sau:

– Producer tạo kết nối và channel sau đó gửi message đến exchange

– Exchange nhận message và xác định các queues nhận message thông qua binding

– Binding kết nối giữa Exchange và Queue, nó sẽ xác định xem message nào sẽ được chuyển từ exchange sang queue thông qua routing key hoặc các pattern của từng loại exchange nếu có

– Exchange gửi message vào Queue thông qua binding, sau đó message sẽ được lưu tại Queue

– Consumer tạo kết nối và channel sau đó nhận message từ Queue và xử lý.

V. Ví dụ sử dụng các loại Exchange bằng PHP

Link: https://github.com/quyenvkbn/rabbitmq

VI. Kết luận

Trên đây là cơ bản những gì mình tìm hiểu được về RabbitMQ. RabbitMQ còn bao gồm một số khái niệm quan trọng như Default Exchange(Direct Exchange với tên chuỗi rỗng), RPC Queue (Remote Procedure Call Queue) và RabbitMQ còn hỗ trợ khá nhiều cơ chế giúp đảm bảo tính toàn vẹn của dữ liệu các bạn có  thể dành thời gian tìm hiểu thêm. Hy vọng bài viết giúp chúng ta hiểu hơn về những gì mà RabbitMQ có thể làm và ưu điểm & hạn chế của nó từ đó chúng ta có thể xem xét và sử dụng nó một cách phù hợp.

Cảm ơn các bạn đã đọc!

VII. Tài liệu tham khảo

1. https://www.rabbitmq.com/

2. https://www.google.com/

3. https://chat.openai.com/

Related Posts