1.前言

RabbitMq提供了多种交换机以及队列,结合不同的交互机和队列搭配,可以创建多种工作模式,接下来开始一一说明RabbitMq支持的工作模式

2.简单模式

角色

  1. 一个Publisher
  2. 一个Consumer
  3. 一个默认交换机
  4. 一个Queue

一个生产者,一个消费者,简单的收发消息

图示

image.png

3.工作模式

角色

  1. 一个Publisher
  2. 多个Consumer
  3. 一个默认交互机
  4. 一个Queue

与简单模式不同的就是多个消费者共同消费一个队列,RabbitMq会通过轮询的方式将消息推送给每个消费者,每个消费者不会同时消费同一条消息

图示

image.png

4.发布订阅模式

角色

  1. 一个Publisher
  2. 多个Consumer
  3. 一个扇形交换机
  4. 多个Queue

多个Queue绑定在一个扇形交换机上,Publisher发送Message到扇形交换机,并且发布时无需指定routing-key
扇形交换机会把消息转发到所有与其绑定的Queue上,因此实现了一种发布订阅模式的消息收发

图示

image.png

演示

  1. 创建两个名为fanout-queue-1,fanout-queue-2的队列

image.png

  1. 将两个队列绑定到fanout交换机上

image.png
image.png

  1. 发送一条内容为fanout-message的消息到扇形交换机

image.png

  1. 查看fanout-queue-1接收消息是否正常,并验证消息内容

image.png

  1. 查看fanout-queue-2接收消息是否正常,并验证消息内容

image.png

5.路由模式

角色

  1. 一个Publisher
  2. 多个Consumer
  3. 一个直连交换机
  4. 多个Queue

与发布订阅模式不同,publisher在路由模式下发布消息时,必须指定一个routing-key。直连交换机会将消息转发到routing-key与binding-key完全匹配队列中

图示

image.png

演示

  1. 创建两个名为direct-queue-1,direct-queue-2的队列

image.png

  1. 将两个队列绑定到直连交换机上,binging-key分别为direct-queue-1、direct-queue-2

image.png
image.png

  1. 发送一条内容为direct-message的消息到直连交换机,routing-key为direct-queue-1

image.png

  1. 验证direct-queue-1是否收到消息,并验证消息内容。可以看到,消息接收成功

image.png

  1. 验证direct-queue-2是否收到消息,并验证消息内容

可以看到,并无消息。路由精准匹配,因此消息只会发送到第一个queue中
image.png

6.主题模式

角色

  1. 一个Publisher
  2. 多个Consumer
  3. 一个主题交换机
  4. 多个Queue

与路由模式不同的是,主题模式下使用的是主题交换机,因此交换机通过路由模糊匹配的方式,将消息转发到对应的Queue中,支持的通配符如下

  • *:只匹配一个词
  • :可以匹配一个或多个词

需要注意的是,所谓的词,需要遵循.xxx.xxx的形式

图示

image.png

演示

  1. 创建两个名为topic-queue-1,topic-queue-2的队列

image.png

  1. 将两个队列绑定到Topic交换机上,binding_key分别为topic.#,topic.*

image.png

  1. 发送一条内容为topic-message的消息,routing-key为topic.route.1

image.png

  1. 验证topic-queue-1是否收到消息,并验证消息内容

可以看到,队列1接收消息成功,因为队列1的binding-key为#,可以匹配多个词
image.png

  1. 验证topic-queue-2是否收到消息,并验证消息内容

可以看到,队列2未收到消息,因为队列2的binding-key为*,只可以匹配一个单词
image.png

RabbitMq的工作模式 - 图23