Sử dụng Topic Exchange và routing key trong RabbitMQ
Bình thường khi sử dụng RabbitMQ, các bạn sẽ publish một message vào trong một queue xác định, tuy nhiên, trong cách sử dụng Topic Exchange và routing key thì message sẽ không được xuất bản trực tiếp vào queue. Thay vào đó, publisher gửi tin nhắn đến một Exchange. Exchange sẽ được sử dụng là tác nhân định tuyến message, và được xác định bởi máy chủ ảo trong RabbitMQ. Exchange chịu trách nhiệm định tuyến (routing) các message đến các queue khác nhau với sự trợ giúp của các header attributes, routing key, bindings và message key.
Để hiểu Topic Exchange là gì, chúng ta hãy cùng tìm hiểu một vài khái niệm cơ bản trước đã nhé.
Khái niệm cơ bản Topic Exchange
Exchange là một tác nhân (agent) định tuyến tin nhắn (message) được xác định trong máy chủ ảo của RabbitMQ.
Routing key là một thuộc tính của tin nhắn (message) mà Exchange sẽ sử dụng nó để quyết định xem tin nhắn sẽ được gửi đến queue nào.
- Một Routing Key trong Topic Exchange phải bao gồm 0 hoặc nhiều từ phân cách bởi dấu chấm (.).
- Routing Key trong Topic Exchange còn gọi là Routing Pattern.
- Routing Pattern tương tự như Regular expression, nhưng chỉ các wildcard *, . và # được phép.
- * : có nghĩa là chính xác một từ được phép.
- # : có nghĩa là 0 hoặc nhiều số từ được phép.
- . : có nghĩa là dấu phân cách từ. Nhiều từ chính được phân tách bằng dấu phân cách dấu chấm.
Binding là một dạng kết nối giúp chúng ta gắn các queue vào trong exchange
Message key là một thuộc tính của tin nhắn mà sẽ dùng để Exchange nhận biết tin nhắn đó có thể liên quan đến Routing key nào, từ đó gửi đến đúng queue cần thiết.
Một vài trường hợp chúng ta sử dụng Topic Exchange:
- Phân phối dữ liệu liên quan đến vị trí địa lý cụ thể.
- Xử lý tác vụ nền được thực hiện bởi nhiều workers, mỗi worker có khả năng xử lý các nhóm tác vụ cụ thể.
- Cập nhật tin tức liên quan đến một category hoặc gắn tag.
- Điều phối các dịch vụ của các loại khác nhau trong cloud.
Ví dụ cụ thể ứng dụng trong mô hình microservice
Ví dụ trong mô hình microservice dưới đây chúng ta sử dụng RabbitMQ để gửi message giữa các service bên trong

- Queue có tên gatewayUser cho Users service subscribe vào
- Queue có tên gatewaySocial cho Social service subscribe vào
- Queue có tên gatewayWebhook cho Webhook service subscribe vào
- Queue gatewayUser vào cho routing key gateway_user
- Queue gatewayWebhook vào cho routing key gateway_webhook
- Queue gatewaySocial vào cho routing key gateway_social.
- Gửi message đến Social service -> Chúng ta sử dụng message key: gateway#social
- Gửi message đến User service -> Chúng ta sử dụng message key: gateway#user
- Gửi message đến Webhook service -> Chúng ta sử dụng message key: gateway#webhook
Hi vọng bài viết của Baobinh.net có thể giúp các bạn một phần để hiểu rõ hơn về Topic Exchange cũng như các thuật ngữ và các vấn đề bên trong như routing key, message key, binding,...
- Posted by anhtuanfullstack
- 2021-08-17 11:25:25