rabbitmq使用者获取不同路由密钥的消息

时间:2015-12-03 04:56:05

标签: php routing rabbitmq consumer publisher

我们有两个消费者,c1(在php中)绑定到交换1,队列1和路由键1;和c2(在java中)交换1,队列1和路由密钥2.即只有路由密钥不同,但交换和队列是相同的。

在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(q2和r2)的消息已被c2和c1接收......这里有些错误。

1 个答案:

答案 0 :(得分:4)

  

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

您已设计好队列和消费者以产生此行为。

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

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

例如:

  • 路由密钥1的E1应该转到QC1
  • 带路由密钥2的E1应该转到QC2
  • C1应使用来自QC1
  • 的消息
  • C2应使用来自QC2的消息

通过为消费者提供单独的队列,您将保证消息传递给适当的消费者