首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RabbitMQ交换机类型简介

在RabbitMQ中,生产者的消息都是通过交换器来接收,然后再由交换器分发到不同的队列中去,在分发的过程中交换器类型会影响分发的逻辑。

在RabbitMQ中交换机类型主要由四种:

扇形交换机:Fanout exchange

直连交换机:Direct exchange

主题交换机:Topic exchange

首部交换机:Headers exchange

四种交换机类型代表四种消息分发的模式,下面我们来详细的看看每一种交换机模式的区别

1. 扇形交换机(Fanout Exchange)

扇形交换机是最基本的交换机类型,它所能做的事情非常简单,就是广播消息。

当一个Msg发送到扇形交换机上时,扇形交换机会将消息分别发送给所有绑定到扇形交换机上的消息队列。扇形交换机将消息路由给绑定到自身的所有消息队列,也就是说路由键在扇形交换机里没有作用,故消息队列绑定扇形交换机时,路由键可为空。因此扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

下面是我在网上找的一张扇形交换机示意图:

2. 直连交换机(DIrect Exchange)

直连交换机是一种带路由功能的交换机。它会将绑定的RountingKey完全匹配的方式路由到当前交换机绑定的,指定的队列上。如果RountingKey不匹配,那么就不会发送到任何队列中去。

注意,首先是队列必须绑定到当前交换机上,其次才是匹配路由。但是队列是可以绑定多个交换机,所以有些队列可以接受到多个交换机的消息

下面是我在网上找的一张直连交换机示意图:

适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列

我们可以在声明创建队列的时候,设置最大优先级,PHP消费者端实现代码如下:

完整代码有点多,忽略了部分,主要的还是设置最大优先级的代码【x-max-priority】

发送消息时,只需要设置当前消息的优先级大小即可,具体代码如下:

忽略了部分代码,主要的还是设置优先级,发送消息时设置优先级,参数 priority 就是优先级的大小

注意,发送消息的方法的第四个参数是一个数组,除了可以设置优先级之外还可以设置过期时间(expiration),头部(headers)等

注意:如果队列已经声明创建了,不能修改。否则会报错,我们可以删除队列重新声明一个

3. 主题交换机(Topic Exchange)

直连交换机的routing_key方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的routing_key,假设每个交换机上都绑定一堆的routing_key连接到各个队列上。那么消息的管理就会异常地困难。

所以RabbitMQ提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。

主题交换机的routing_key需要有一定的规则,交换机和队列绑定的路由key(binding_key)需要采用*.#.*.....的格式。

如果路由键以 . 为分隔符,每一个分隔符的代表一个单词,通配符 * 匹配一个单词、通配符 # 可以匹配多个单词

4. 头部交换机(Headers Exchange)

头部交换机是忽略routing_key的一种路由方式。不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在Queue绑定Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的

交换机绑定队列的时候,Hash结构中要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,头部交换机的优势是匹配的规则不被限定为字符串(string)。

这种交换器类型在性能上相对来说较差,在实际工作中很少会用到

总结:

从消息分发的性能上来比较:fanout > direct > topic > headers

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8AGFK5HWE2Gg2CU5rSqnyDw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券