15

Trước khi chúng ta bắt đầu, tôi hy vọng bạn đã hiểu RabbitMQ là gì, nó làm gì và các khóa trao đổi, hàng đợi, ràng buộc và định tuyến là gì. Vâng, chúng ta hãy bắt đầu.

Có hai ứng dụng được xây dựng cho bài viết này, chúng được gọi là nhà sản xuất thỏ và người tiêu dùng thỏ. Cả hai ứng dụng đều được viết bằng Java Spring Boot.

Lược đồ ứng dụng

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)

Từ sơ đồ trên, bạn có thể thấy rằng:

  1. Trao đổi trực tiếp được liên kết với Hàng đợi A bằng khóa định tuyến direct1 .
  2. Trao đổi trực tiếp được liên kết với Hàng đợi B bằng khóa định tuyến direct2 .
  3. Topic Exchange được liên kết với Hàng đợi C bằng khóa định tuyến Rabbitmq. # .
  4. Trao đổi chủ đề được liên kết với Hàng đợi D bằng khóa định tuyến Rabbitmq.spring. # .
  5. Fanout Exchange bị ràng buộc với hàng đợi Ewithout khóa định tuyến (vì trao đổi fanout không cần khóa).
  6. Fanout Exchange bị ràng buộc với hàng đợi F mà không có khóa định tuyến (vì trao đổi fanout không cần khóa).

Inside application.properties


spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

exchange.direct=direct-exchange
exchange.topic=topic-exchange
exchange.fanout=fanout-exchange

queue.A=queue-A
queue.B=queue-B
queue.C=queue-C
queue.D=queue-D
queue.E=queue-E
queue.F=queue-F

routing.direct.1=direct1
routing.direct.2=direct2
routing.topic.rabbitmq.#=rabbitmq.#
routing.topic.rabbitmq.spring.#=rabbitmq.spring.#

Trao đổi trực tiếp

Trao đổi trực tiếp là một trao đổi chuyển tiếp thông điệp đến hàng đợi dựa trên khóa định tuyến của thông báo. Hãy xem mã của nhà sản xuất Rabbitmq bên dưới.

@Value("${routing.direct.1}")
    private String direct1RoutingKey;

@Bean
public Binding bindingDirectExchangeQueueADirect1(DirectExchange directExchange, Queue queueA) {
    return BindingBuilder.bind(queueA).to(directExchange).with(direct1RoutingKey);
}
@Value("${routing.direct.2}")
    private String direct2RoutingKey;

@Bean
public Binding bindingDirectExchangeQueueBDirect2(DirectExchange directExchange, Queue queueB) {
    return BindingBuilder.bind(queueB).to(directExchange).with(direct2RoutingKey);
}

Cả hai mã đều liên quan đến việc ràng buộc trao đổi trực tiếp với hàng đợi A với khóa định tuyến direct1 và hàng đợi B với khóa định tuyến direct2.

Vì vậy, khi nhà sản xuất gửi một tin nhắn để trao đổi trực tiếp với khóa định tuyến direct1, nó sẽ được gửi đến hàng đợi A.

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)
Gửi tin nhắn để trao đổi trực tiếp với khóa định tuyến direct1 thông qua điểm cuối API với Postman

Xem nhật ký từ người tiêu dùng thỏ bên dưới.

Message received in Queue A : message to direct-exchange with direct1 routing key

Khi nhà sản xuất gửi một tin nhắn đến trao đổi trực tiếp với khóa định tuyến direct2, nó sẽ được gửi đến hàng đợi B.

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)
Gửi tin nhắn để trao đổi trực tiếp với khóa định tuyến direct1 thông qua điểm cuối API với Postman.

Xem nhật ký từ người tiêu dùng thỏ bên dưới.

Message received in Queue B : message to direct-exchange with direct2 routing key

Trao đổi chủ đề

Trao đổi chủ đề cũng giống như trao đổi trực tiếp, nhưng khóa định tuyến ở đây còn được gọi là mẫu định tuyến vì khóa định tuyến không cố định. Thay vào đó, nó sử dụng các ký tự đại diện. Hãy xem mã của nhà sản xuất Rabbitmq bên dưới.

@Value("${routing.topic.rabbitmq.#}")
    private String topicRabbitMQRoutingKey;

@Bean
public Binding bindingTopicExchangeQueueCTopicRabbitMQ(TopicExchange topicExchange, Queue queueC) {
    return BindingBuilder.bind(queueC).to(topicExchange).with(topicRabbitMQRoutingKey);
}
@Value("${routing.topic.rabbitmq.spring.#}")
    private String topicRabbitMQSpringRoutingKey;

@Bean
public Binding bindingTopicExchangeQueueDTopicRabbitMQSpring(TopicExchange topicExchange, Queue queueD) {
    return BindingBuilder.bind(queueD).to(topicExchange).with(topicRabbitMQSpringRoutingKey);
}

Mã đầu tiên là ràng buộc giữa trao đổi chủ đề với hàng đợi C với mẫu định tuyến Rabbitmq. # . Ví dụ: khóa định tuyến Rabbitmq.learning, Rabbitmq.spring.learning và Rabbitmq.learning.exchange khớp với mẫu đó.

Mã thứ hai là ràng buộc giữa trao đổi chủ đề với hàng đợi D với mẫu định tuyến Rabbitmq.spring. # . Ví dụ: khóa định tuyến Rabbitmq.spring.learning và Rabbitmq.spring.learning.exchange khớp với mẫu đó.

Giả sử chúng ta muốn gửi một tin nhắn với khóa định tuyến Rabbitmq.learning .

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)

Tin nhắn sẽ được gửi đến hàng đợi C.

Message received in Queue C : message to topic-exchange with rabbitmq.learning routing key

Nếu chúng ta muốn gửi tin nhắn bằng khóa định tuyến Rabbitmq.spring.learning :

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)

Thông báo sẽ được gửi đến hàng đợi C và hàng đợi D.

Message received in Queue C : message to topic-exchange with rabbitmq.spring.learning routing key
Message received in Queue D : message to topic-exchange with rabbitmq.spring.learning routing key

Sàn giao dịch Fanout

Sự khác biệt chính giữa trao đổi fanout và các trao đổi khác là trao đổi fanout không cần khóa định tuyến để chuyển tiếp tin nhắn đến hàng đợi. Trao đổi Fanout sẽ chuyển tiếp tin nhắn đến mọi hàng đợi liên kết với nó. Hãy xem đoạn mã dưới đây.

@Bean
public Binding bindingFanoutExchangeQueueEFanout(FanoutExchange fanoutExchange, Queue queueE) {
   return BindingBuilder.bind(queueE).to(fanoutExchange);
}
@Bean
public Binding bindingFanoutExchangeQueueFFanout(FanoutExchange fanoutExchange, Queue queueF) {
   return BindingBuilder.bind(queueF).to(fanoutExchange);
}

Mã đầu tiên là ràng buộc giữa fanout-trao đổi với hàng đợi E. Mã thứ hai là ràng buộc giữa fanout-trao đổi với hàng đợi F. Như bạn có thể thấy, không có khóa định tuyến nào được chỉ định trong quá trình liên kết.

Khi chúng ta gửi một tin nhắn đến fanout-exchange, tin nhắn sẽ được chuyển tiếp đến hàng đợi E và hàng đợi F.

Tìm hiểu các loại trao đổi RabbitMQ (Với Spring Boot)

Đây là nhật ký của người tiêu dùng thỏ.

Message received in Queue E : message to fanout-exchange
Message received in Queue F : message to fanout-exchange

Đó là nó!

Đó là tất cả về các loại trao đổi trong RabbitMQ. Mã nguồn hoàn chỉnh có thể được tìm thấy ở đây .

|