文章目录
前言
RabbitMQ中总共有4种交换机,分别是:
直接交换机(direct)
标题交换机(headers)
扇出交换机(fanout)
主题交换机(topic)
一、直接交换机(direct)
直接交换机和扇出交换机很类似,扇出交换机的所有绑定都一样,而直接交换机的绑定不一样,也就是说,扇出交换机是把所有接收到的消息全部发给绑定的队列,而直接交换机是根据绑定的routingKey有选择的把消息发给指定的队列,直接交换机使用的是路由模式。
二、标题交换机(Header)
与routingKey无关,匹配机制是匹配消息头中的属性信息。在绑定消息队列与交换机之前声明一个map键值对,通过这个map对象实现消息队列和交换机的绑定。当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。
匹配规则x-match有下列两种类型:
x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息
三、扇出交换机(fanout)
扇出交换机是将从生产者接收到的所有消息广播到它所知道的所有队列中(也就是和扇出交换机所绑定的所有队列),使用的是发布–订阅模式,队列订阅(绑定)这个交换机,一但这个交换机发送消息,所有订阅(绑定)这个交换机的队列都会收到消息。
四、主题交换机(topic)
主题交换机是在直接交换机基础上的在一次增强,直接交换机每次只能根据routingKey把消息发送到某一个队列上,不能一次发送到多个队列上,而主题交换机可以解决这样的问题,主题交换机就是按照一定的匹配规则来把消息发送到匹配的消息队列上,所以发送到topic交换机的消息的routingKey不能随意写,必须满足一定的要求,他必须是一个单词列表,以点号分隔开。这些单词可以随意写,比如“dada.ffk”,“urru.ouu”,“eif.fggi.ebff”等,这个单词列表的做最多不能超过255个字节。在这个规则中"“(星号)可以代替一个单词,”#"(井号)可以代替零个或多个单词。
例如:
中间带orange带3个单词的字符串:(.orange.)
最后一个单词是rabbit的3个单词:(..rabbit)
第一个单词是lazy的多个单词(lazy.#)
举个例子:
上图之间数据接收情况是这样的:
当队列绑定关系是下列这种情况时:
1、当一个队列绑定键是#,那么这个队列将接收所有数据,就有点像fanout(扇出交换机)了;
2、当一个队列绑定键当中没有#和出现,那么该队列绑定键就是direct了。
版权归原作者 蜡笔小兴zero 所有, 如有侵权,请联系我们删除。