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.

Routing Key trong Topic Exchange:
  • 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.
Ý nghĩa các wildcard được sử dụng là:
  • * : 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

Ví dụ microservice sử dụng Topic Exchange


  
Gateway service sẽ cần phải gửi payload đến tất cả các service: Social services, Users service và Webhook service. Chúng ta cần tạo:
  • 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
Chúng ta sẽ gắn:
  • 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.
Ngôn ngữ lập trình / framework sẽ hỗ trợ bạn làm công việc binding này.
 
Khi chúng ta gửi một message từ Gateway service đến RabbitMQ (broadcast), chúng ta chỉ cần gắn cho message đó một message key.
  • 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
Như thế, tất cả các message sẽ được tự động gửi đến đúng queue cần thiết và subscriber xử lý công việc tương ứng mà không cần phải cấu hình ở code. Thứ duy nhất chúng ta cần làm là định nghĩa một vài static variable để lưu giá trị của routing key, message key và queue. Đây là cách rất dễ dàng và nhẹ nhàng để quản lý việc định hướng và điều phối cho các payload trong một hệ thống microservice với nhiều dịch vụ khác nhau.

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,...