@adamhand
2019-01-02T11:31:00.000000Z
字数 1495
阅读 655
可以用一个形象的比喻来描述路由过程:交换器相当于投递包裹的邮箱,Routing Key相当于填写在包裹上的地址,Binding Key相当于包裹的目的地址,当填写在包裹上的地址和包裹的实际地址相匹配时,这个包裹才会被正确投递到目的地。这个包裹的“主人”——Queue可以保留这个包裹。
如果填写的地址出错,没有找到匹配的目的地址,包裹便不能被正确投递,有可能会还给寄件人,有可能会被丢弃。
RabbitMQ常用的交换器类型有fanout、direct、topic、headers这四种。AMQP协议里还有另外两种类型:System和自定义,但是不是很常用。
会将所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
direct类型的交换机会将消息路由到那些Binding Key和Routing Key**完全匹配**的队列中。
如下图所示,交换器的类型为direct,如果某条消息的路由键为“warning”,则消息会路由到Queue1和Queue2中;如果设置路由键为“info”或者“debug”,消息只会路由到Queue2。
direct中的路由方式是RoutingKey和BindingKey的完全匹配,而topic提供了一种更为宽松的“模糊匹配”方式。
在topic中,每一个RoutingKey和BindingKey都做是一个被“.”分隔的字符串(被“.”分隔的每一个独立的字符串都成为一个单词)。比如“java.util.concurrent”。
BindingKey中可以存在两种特殊字符串“*
”和“#
”用作模糊匹配。其中“*
”用于匹配一个单词,“#
”用于匹配多个单词,也可以是0个。
如下图所示,
headers属性的交换器不依赖与路由键的规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定队列和交换器的时候指定一组键值对,当发送消息到交换机时,RabbitMQ会获得消息中的headers(也是一个键值对)属性,对比其中的键值对是否完全匹配队列和交换机绑定时指定的键值对,如果完全匹配会将消息路由到该队列,否则不会进行路由。
headers交换机的性能很差且不实用,基本上不会被用到。
《RabbitMQ实战指南》
【RabbitMQ】三种类型交换器 Fanout,Direct,Topic