

消息队列Rabbitmq的交换器类型
source link: https://segmentfault.com/a/1190000022588933
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、交换器类型
在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的时候,才会将消息分发到指定队列;
一个队列是可以指定多个路由键的,我们假设有两个队列,分别是 队列一
、 队列二
;在 队列一
中指定了三个路由键,分别是 zhangsan
、 lisi
, 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
的情况下,交换器分发消息的时候也需要同时匹配 bindKey
和 routingKey
;但与 direct
类型不同的是当交换器发现类型为 topic
时候,判断routeing的规则是模糊匹配模式。
rabitmq自定义了一套匹配规则,在这里我假设生产者发送了一个消息,其中的的routingKey为 wiki.imooc.com
,那么交换器为 topic
类型时候,想要获取到这条消息,可以用 *
号作为通配符,来指定routingKey,分别是 *.*.com
、 *.imooc.*
、 *wiki.imooc.*
;同样也可以使用 #
作为通配符来指定路由键,例如 wiki.#
、 #.com
;
在上面的通配符列子中,我们需要掌握这几点:
-
路由键以
.
为分隔符,每一个分隔符的代表一个单词 -
通配符
*
匹配一个单词、通配符#
可以匹配多个单词 -
*
可以在routingKey和bindKey上使用,#
只能用于RoutingKey中
五、headers
类型为 headers
的交换器与前面三种匹配方式完全不一样,它不依赖与bindingKey和routingKey,而是在绑定队列与交换器的时候指定一个键值对;当交换器在分发消息的时候会先解开消息体里的 headers
数据,然后判断里面是否有所设置的键值对,如果发现匹配成功,才将消息分发到队列中;这种交换器类型在性能上相对来说较差,在实际工作中很少会用到。
六、小结
-
从消息分发的性能上来比较:
fanout
>direct
>topic
>headers
- topic的匹配规则只是用于消费者而不是生产者
作者:汤青松
日期:2020-05-09
Recommend
-
48
亚马逊旗下的云计算业务 AWS 当前正考虑涉足硬件市场,推出自己的网络交换器设备。受此影响,在美上市的网络设备公司股价当日普跌。 思科股价在周五下滑了4%...
-
82
RabbitMQMQ(MessageQueue,消息队列)是一款消息中间件,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。集群原理rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基...
-
75
一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ...
-
51
作者: 海向 出处:https://www.cnblogs.com/haixiang/p/10966985.html ...
-
62
Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka) 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较...
-
59
RabbitMQ之消息队列“治堵”秘籍 曾几何时,办公室惨叫连连,各类运维状况触目惊心。 ”服务流量太大,超出了机器承受范围导致服务凉凉。” ”这代码耦合度怎么这么高,改一处...
-
30
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不...
-
26
消息队列探秘-RabbitMQ消息队列介绍 1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(...
-
56
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 SOAP 等),但是在异步...
-
29
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长。 楔子 先给大家说声抱歉,最近一周都没有发文,有一些比较要紧重要的事需要处理。 今天正好得空,本来说准备写 SpringIOC 相关的东西...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK