广播式交换器类型(fanout)
该类交换器不分析所接收到消息中的Routing Key,默认将消息转发到所有与该交换器绑定的队列中去。广播式交换器转发效率最高,但是安全性较低,消费者应用程序可获取本不属于自己的消息。
广播交换器是最简单的一种类型,就像我们从字面上理解到的一样,它把所有接受到的消息广播到所有它所知道的队列中去,不论消息的关键字是什么,消息都会被路由到和该交换器绑定的队列中去。
它的工作方式如下图所示:
在程序中申明一个广播式交换器的代码如下:
channel.exchange_declare(exchange='fanout',type='fanout')
直接式交换器类型(direct)
该类交换器需要精确匹配Routing Key与BindingKey,如消息的Routing Key = Cloud,那么该条消息只能被转发至Binding Key = Cloud的消息队列中去。直接式交换器的转发效率较高,安全性较好,但是缺乏灵活性,系统配置量较大。
相对广播交换器来说,直接交换器可以给我们带来更多的灵活性。直接交换器的路由算法很简单——一个消息的routing_key完全匹配一个队列的 binding_key,就将这个消息路由到该队列。绑定的关键字将队列和交换器绑定到一起。当消息的routing_key和多个绑定关键字匹配时消息 可能会被发送到多个队列中。
我们通过下图来说明直接交换器的工作方式:
如图:Q1,Q2两个队列绑定到了直接交换器X上,Q1的binding_key是“orange”,Q2有两个绑定,一个binding_key是black,另一个binding_key是green。在这样的关系下,一个带有 “orange” routing_key的消息发送到X交换器之后将会被X路由到队列Q1,一个带有 “black” 或者 “green” routing_key的消息发送到X交换器之后将会被路由到Q2。而所有其他消息将会被丢失掉。
主题式交换器(Topic Exchange)
该类交换器通过消息的Routing Key与Binding Key的模式匹配,将消息转发至所有符合绑定规则的队列中。Binding Key支持通配符,其中“*”匹配一个词组,“#”匹配多个词组(包括零个)。例如,Binding Key=“*.Cloud.#”可转发Routing Key=“OpenStack.Cloud.GD.GZ”、“OpenStack.Cloud.Beijing”以及“OpenStack.Cloud”的消息,但是对于Routing Key=“Cloud.GZ”的消息是无法匹配的。
这里的routing_key可以使用一种类似正则表达式的形式,但是特殊字符只能是“*”和“#”,“*”代表一个单词,“#”代表0个或是多个单词。这样发送过来的消息如果符合某个queue的routing_key定义的规则,那么就会转发给这个queue。
紧接着说一下交换机.交换机的主要作用是接收相应的消息并且绑定到指定的队列.交换机有四种类型,分别为Direct,topic,headers,Fanout.
Direct是RabbitMQ默认的交换机模式,也是最简单的模式.即创建消息队列的时候,指定一个BindingKey.当发送者发送消息的时候,指定对应的Key.当Key和消息队列的BindingKey一致的时候,消息将会被发送到该消息队列中.
topic转发信息主要是依据通配符,队列和交换机的绑定主要是依据一种模式(通配符+字符串),而当发送消息的时候,只有指定的Key和该模式相匹配的时候,消息才会被发送到该消息队列中.
headers也是根据一个规则进行匹配,在消息队列和交换机绑定的时候会指定一组键值对规则,而发送消息的时候也会指定一组键值对规则,当两组键值对规则相匹配的时候,消息会被发送到匹配的消息队列中.
Fanout是路由广播的形式,将会把消息发给绑定它的全部队列,即便设置了key,也会被忽略.
注意:关于bingkey : 在rabbit 管理界面中,没有这个参数,但是你操作交换机与队列绑定时,就默认了两者的关系。同时还有一点需要注意:关于routingkey 它是用来匹配的,但是它是用于匹配与之绑定的队列的名字(这点很多说明介绍文档中没有提,导致我一直以为routing key 只要设置好,然后在消息进行交换机后,会对你发送消息中的routingkey 与匹配 交换机与队列绑定时设置的key,导致数据一直接收不到)
本文参考:http://terry0501.iteye.com/blog/2329580