在rabbitmq中,生产者的消息都是经过交换器
来接收,而后再从交换器
分发到不一样的队列中去,在分发的过程当中交换器类型
会影响分发的逻辑。性能
rabitmq中的交换器
有4种类型,分别为fanout、direct、topic、headers四种,其中前三种较为常见,后面一种用的比较少。测试
通常状况下交换器分发会先找出绑定的队列,而后再判断routekey
,来决定是否将消息分发到某一个队列中;但若是交换器的类型为fanout
,那么交换器就再也不判断routekey
了,而是将消息直接分发到绑定的队列中去,以下测试代码code
Channel channel = connection.createChannel(); //在rabbitmq中建立一个信道 channel.exchangeDeclare("exchangeName", "fanout"); //建立一个type为fanout的交换器 channel.queueDeclare("queueName"); //建立一个队列 channel.queueBind("queueName", "exchangeName", "routingKey"); //将队列和交换器绑定
在类型为direct
的状况下,交换器在分发消息的时候一样会先获取绑定的队列,而后还会再判断routeing
;当交换器发现类型为direct
判断routeing的规则是彻底匹配模式,只有消息彻底等于到routeing的时候,才会将消息分发到指定队列;rabbitmq
一个队列是能够指定多个路由键的,咱们假设有两个队列,分别是队列一
、队列二
;在队列一
中指定了三个路由键,分别是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匹配的时候匹配都匹配成功,所以两个队列都收到了消息;it
在类型为topic
的状况下,交换器分发消息的时候也须要同时匹配bindKey
和routingKey
;但与direct
类型不一样的是当交换器发现类型为topic
时候,判断routeing的规则是模糊匹配模式。io
rabitmq自定义了一套匹配规则,在这里我假设生产者发送了一个消息,其中的的routingKey为wiki.imooc.com
,那么交换器为topic
类型时候,想要获取到这条消息,能够用*
号做为通配符,来指定routingKey,分别是*.*.com
、*.imooc.*
、*wiki.imooc.*
;一样也可使用#
做为通配符来指定路由键,例如wiki.#
、#.com
;route
在上面的通配符列子中,咱们须要掌握这几点:channel
.
为分隔符,每个分隔符的表明一个单词*
匹配一个单词、通配符#
能够匹配多个单词*
能够在routingKey和bindKey上使用,#
只能用于RoutingKey中类型为headers
的交换器与前面三种匹配方式彻底不同,它不依赖与bindingKey和routingKey,而是在绑定队列与交换器的时候指定一个键值对;当交换器在分发消息的时候会先解开消息体里的headers
数据,而后判断里面是否有所设置的键值对,若是发现匹配成功,才将消息分发到队列中;这种交换器类型在性能上相对来讲较差,在实际工做中不多会用到。
fanout
> direct
> topic
> headers
做者:汤青松
日期:2020-05-09