在RabbitMQ Fifth Tutorial中(对于Ruby,但它们对所有语言都是相同的),他们提到:
我们创建了三个绑定:Q1绑定了绑定键“
*.orange.*
” 和Q2包含“*.*.rabbit
”和“lazy.#
”
然后:
“
lazy.pink.rabbit
”只会被传递到第二个队列一次, 即使它匹配两个绑定。
这怎么可能?据我所知,如果路由密钥匹配45个队列,它将转到所有45个队列。为什么这不是这种情况呢?
答案 0 :(得分:2)
Q2
有两个绑定,它们都匹配单个消息。根据
AMQP 0.9.1 specification, section 1.7.2.3. Method queue.bind(第35页):
即使队列有多个与消息匹配的绑定,服务器也不能多次向队列传递相同的消息。
测试场景:
客户端声明一个命名队列,并使用多个绑定将其绑定到
amq.topic
交换。然后,客户端发布一条与其所有绑定匹配的消息。
因此,当lazy.pink.rabbit
路由密钥与*.*.rabbit
和lazy.#
路由密钥匹配时,该邮件不会被复制到Q2
,并且只有该邮件的一个副本将驻留在Q2
。
P.S:
有很好的Compatibility and Conformance RabbitMQ文档页面,其中包含一个地方的所有规范。