消息队列Rabbitmq的交换器类型

栏目: IT技术 · 发布时间: 3年前

内容简介:在rabbitmq中,生产者的消息都是通过rabitmq中的一般情况下交换器分发会先找出绑定的队列,然后再判断

一、交换器类型

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

rabitmq中的 交换器 有4种类型,分别为fanout、direct、topic、headers四种,其中前三种较为常见,后面一种用的比较少。

二、fanout

一般情况下交换器分发会先找出绑定的队列,然后再判断 routekey ,来决定是否将消息分发到某一个队列中;但如果交换器的类型为 fanout ,那么交换器就不再判断 routekey 了,而是将消息直接分发到绑定的队列中去,如下测试代码

Channel channel = connection.createChannel();    //在rabbitmq中创建一个信道
channel.exchangeDeclare("exchangeName", "fanout"); //创建一个type为fanout的交换器    
channel.queueDeclare("queueName");    //创建一个队列
channel.queueBind("queueName", "exchangeName", "routingKey");   //将队列和交换器绑定

三、direct

在类型为 direct 的情况下,交换器在分发消息的时候同样会先获取绑定的队列,然后还会再判断 routeing ;当交换器发现类型为 direct 判断routeing的规则是完全匹配模式,只有消息完全等于到routeing的时候,才会将消息分发到指定队列;

一个队列是可以指定多个路由键的,我们假设有两个队列,分别是 队列一队列二 ;在 队列一 中指定了三个路由键,分别是 zhangsanlisi , wangwu ,在 队列二 中指定了一个队列键 lisi ,指定多个路由键的代码如下所示:

Channel channel = connection.createChannel();    //在rabbitmq中创建一个信道
channel.exchangeDeclare("exchangeName", "direct"); //创建一个type为direct的交换器
channel.queueDeclare("queueName");    //创建一个队列
channel.queueBind("queueName", "exchangeName", "zhangsna");   //绑定并设置路由键
channel.queueBind("queueName", "exchangeName", "lisi");   //绑定并设置路由键
channel.queueBind("queueName", "exchangeName", "wangwu");   //绑定并设置路由键

当生产者发送了一条routeting为 zhangsan 的消息到交换器中,交换器在分发的时候只会把消息分发到 队列一 里面去,因为交换器在routeting匹配的时候只匹配到了 队列一 ,因此 队列二 不会收到消息;

当生产者再次发送了一条routeting为 lisi 的消息到交换器中,交换器在分发的时候会把消息分发到 队列一队列二 两个队列里面去,因为交换器在routeting匹配的时候匹配都匹配成功,因此两个队列都收到了消息;

四、topic

在类型为 topic 的情况下,交换器分发消息的时候也需要同时匹配 bindKeyroutingKey ;但与 direct 类型不同的是当交换器发现类型为 topic 时候,判断routeing的规则是模糊匹配模式。

rabitmq自定义了一套匹配规则,在这里我假设生产者发送了一个消息,其中的的routingKey为 wiki.imooc.com ,那么交换器为 topic 类型时候,想要获取到这条消息,可以用 * 号作为通配符,来指定routingKey,分别是 *.*.com*.imooc.**wiki.imooc.* ;同样也可以使用 # 作为通配符来指定路由键,例如 wiki.##.com

在上面的通配符列子中,我们需要掌握这几点:

  • 路由键以 . 为分隔符,每一个分隔符的代表一个单词
  • 通配符 * 匹配一个单词、通配符 # 可以匹配多个单词
  • * 可以在routingKey和bindKey上使用, # 只能用于RoutingKey中

五、headers

类型为 headers 的交换器与前面三种匹配方式完全不一样,它不依赖与bindingKey和routingKey,而是在绑定队列与交换器的时候指定一个键值对;当交换器在分发消息的时候会先解开消息体里的 headers 数据,然后判断里面是否有所设置的键值对,如果发现匹配成功,才将消息分发到队列中;这种交换器类型在性能上相对来说较差,在实际工作中很少会用到。

六、小结

  1. 从消息分发的性能上来比较: fanout > direct > topic > headers
  2. topic的匹配规则只是用于消费者而不是生产者

作者:汤青松

日期:2020-05-09


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

交互设计之路

交互设计之路

库帕 / Chris Ding / 电子工业出版社 / 2006-3 / 38.00元

本书是基于众多商务案例,讲述如何创建更好的、高客户忠诚度的软件产品和基于软件的高科技产品的书。本书列举了很多真实可信的实际例子,说明目前在软件产品和基于软件的高科技产品中,普遍存在着“难用”的问题。作者认为,“难用”问题是由这些产品中存在着的高度“认知摩擦”引起的,而产生这个问题的根源在于现今软件开发过程中欠缺了一个为用户利益着想的前期“交互设计”阶段。“难用”的产品不仅损害了用户的利益,最终也将......一起来看看 《交互设计之路》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具