2015-12-03 109 views
0

我们有两个消费者用c1(在php中)绑定交换1,队列1和路由密钥1;和c2(在java中)交换1,队列1和路由密钥2.即仅路由密钥不同,但交换和队列相同。rabbitmq消费者获取不同路由密钥的消息

在PHP

,我们结合为下列情况

$channel->queue_bind($this->queue, $this->exchange, $this->routing1); 

在Java中,以下

channel.queueBind(queue, exchange, routing2); 

现在,当我们发布使用路由键2的消息意味着C2,我们观察到,消息以循环方式由c1和c2接收,而不是仅由c2接收。

C1和C2的发件人都在PHP中,与发件人C1具有下列功能

$channel->basic_publish($message, $this->exchange, $this->routing1); 

和发件人为C2并以下

$channel->basic_publish($message, $this->exchange, $this->routing2); 

的我们有正确的假设?代码有什么问题吗?

[Edit1]作为实验,我们更改为绑定到两个消费者和发布者的单独队列。我们观察到c2(c2和r2)的消息已经被c2和c1接收了......这里有些事情是错误的。

回答

3

只有路由密钥不同,但交换和队列是一样的。

你已经设计了你的队列和消费者来产生这种行为。

当RMQ拥有多个消费者队列时,它会将消息从该队列中循环到所有可用消费者。这是在RMQ中设计的 - 它允许您扩展给定队列的消费者数量,因此您可以处理大量的消息。

如果你需要C1和C2来接收不同的消息,而不是来自Q1之间的循环消息,那么C1和C2必须有不同的队列,他们被订阅。

例如:

  • E1与路由密钥1应该去QC1
  • E1与路由钥匙2应该去QC2
  • C1应从QC1消耗消息
  • C2应使用消息来自QC2

通过为消费者分开排队,您将保证消息传递给正确的消费者

+1

感谢您的明确解释! – bcbishop

相关问题