【RabbitMQ】7(自)、交换机之topic模式
1、之前类型的问题
- 在上一个小节中,我们改进了日志记录系统,我们没有使用只能进行随意广播的fanout交换机,而是使用了direct交换机,从而有能实现选择性地接收日志
- 尽管使用direct交换机改进了我们的系统,但是它仍然存在局限性;比方说我们想接收的日志类型有info.base和info.advantage,某个队列只想要info.base的消息,那这个时候direct就办不到了。这个时候只能使用topic类型
2、Topic的要求
- 发送到类型是topic交换机的消息的routting_key不能随意写,必须满足一定的要求,它必须是一个单词列表,以点号分隔开。这些单词可以是任意单词,比如说:"stock.usd.nyse", "nyse.vmw","quick.orange.rabbit"这种类型的。当然这个单词列表最多不能超过255个字节。
- 在这个规则列表中,其中有两个替换符是大家需要注意的:
- *(星号)可以代替一个单词
- #(井号)可以替代零个或多个单词
3、Topic匹配案例
- 下图绑定关系如下:
- Q1-->绑定的是中间带orange带3个单词的字符串(*.orange.*)
- Q2-->绑定的是
- 最后一个单词是rabbit的3个单词(*.*.rabbit)
- 第一个单词是lazy的多个单词(lazy.#)

- 上图是一个队列绑定关系图,我们来看看他们之间数据接收情况是怎么样的
- quick.orange.rabbit 被队列Q1Q2接收到
- lazy.orange.elephant 被队列Q1Q2接收到
- quick.orange.fox 被队列Q1接收到
- lazy.brown.fox 被队列Q2接收到
- lazy.pick.rabbit 虽然满足两个绑定但只被队列Q2接收一次
- quick.brown.fox 不匹配任何绑定不会被任何队列接收到会被丢弃
- quick.orange.male.rabbit 是四个单词不匹配任何绑定会被丢弃
- lazy.orange.male.rabbit 是四个单词但是匹配Q2
- 当队列绑定关系是下列这种情况时需要引起注意:
- 当一个队列绑定键是#,那么这个队列将接收所有数据,这就有点像fanout了
- 如果队列绑定键当中没有#和*出现,那么该队列绑定类型就是direct了
4、实战
本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16404778.html

浙公网安备 33010602011771号