1.前言
RabbitMq提供了多种交换机以及队列,结合不同的交互机和队列搭配,可以创建多种工作模式,接下来开始一一说明RabbitMq支持的工作模式
2.简单模式
角色
- 一个Publisher
- 一个Consumer
- 一个默认交换机
- 一个Queue
图示
3.工作模式
角色
- 一个Publisher
- 多个Consumer
- 一个默认交互机
- 一个Queue
与简单模式不同的就是多个消费者共同消费一个队列,RabbitMq会通过轮询的方式将消息推送给每个消费者,每个消费者不会同时消费同一条消息
图示
4.发布订阅模式
角色
- 一个Publisher
- 多个Consumer
- 一个扇形交换机
- 多个Queue
多个Queue绑定在一个扇形交换机上,Publisher发送Message到扇形交换机,并且发布时无需指定routing-key
扇形交换机会把消息转发到所有与其绑定的Queue上,因此实现了一种发布订阅模式的消息收发
图示
演示
- 创建两个名为fanout-queue-1,fanout-queue-2的队列
- 将两个队列绑定到fanout交换机上
- 发送一条内容为fanout-message的消息到扇形交换机
- 查看fanout-queue-1接收消息是否正常,并验证消息内容
- 查看fanout-queue-2接收消息是否正常,并验证消息内容
5.路由模式
角色
- 一个Publisher
- 多个Consumer
- 一个直连交换机
- 多个Queue
与发布订阅模式不同,publisher在路由模式下发布消息时,必须指定一个routing-key。直连交换机会将消息转发到routing-key与binding-key完全匹配队列中
图示
演示
- 创建两个名为direct-queue-1,direct-queue-2的队列
- 将两个队列绑定到直连交换机上,binging-key分别为direct-queue-1、direct-queue-2
- 发送一条内容为direct-message的消息到直连交换机,routing-key为direct-queue-1
- 验证direct-queue-1是否收到消息,并验证消息内容。可以看到,消息接收成功
- 验证direct-queue-2是否收到消息,并验证消息内容
可以看到,并无消息。路由精准匹配,因此消息只会发送到第一个queue中
6.主题模式
角色
- 一个Publisher
- 多个Consumer
- 一个主题交换机
- 多个Queue
与路由模式不同的是,主题模式下使用的是主题交换机,因此交换机通过路由模糊匹配的方式,将消息转发到对应的Queue中,支持的通配符如下
图示
演示
- 创建两个名为topic-queue-1,topic-queue-2的队列
- 将两个队列绑定到Topic交换机上,binding_key分别为topic.#,topic.*
- 发送一条内容为topic-message的消息,routing-key为topic.route.1
- 验证topic-queue-1是否收到消息,并验证消息内容
可以看到,队列1接收消息成功,因为队列1的binding-key为#,可以匹配多个词
- 验证topic-queue-2是否收到消息,并验证消息内容
可以看到,队列2未收到消息,因为队列2的binding-key为*,只可以匹配一个单词