rabbitmq 消费者获取不同路由密钥的消息
rabbitmq consumer getting messages of different routing key
我们有两个使用 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 和 c1 都收到了发往 c2(q2 和 r2)的消息...这里出了点问题。
only routing keys are different, but exchange and queue are same.
你设计了你的队列和消费者来产生这种行为。
当 RMQ 有一个队列的多个消费者时,它会将来自该队列的消息循环发送给所有可用的消费者。这是 RMQ 中的设计 - 它允许您扩展给定队列的消费者数量,因此您可以处理更大数量的消息。
如果您需要 C1 和 C2 接收不同的消息,而不是在它们之间循环接收来自 Q1 的消息,则 C1 和 C2 必须订阅不同的队列。
例如:
- 具有路由密钥 1 的 E1 应该转到 QC1
- 具有路由密钥 2 的 E1 应该转到 QC2
- C1 应该使用来自 QC1 的消息
- C2 应该使用来自 QC2 的消息
通过为消费者设置单独的队列,您将保证消息到达正确的消费者
我们有两个使用 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 和 c1 都收到了发往 c2(q2 和 r2)的消息...这里出了点问题。
only routing keys are different, but exchange and queue are same.
你设计了你的队列和消费者来产生这种行为。
当 RMQ 有一个队列的多个消费者时,它会将来自该队列的消息循环发送给所有可用的消费者。这是 RMQ 中的设计 - 它允许您扩展给定队列的消费者数量,因此您可以处理更大数量的消息。
如果您需要 C1 和 C2 接收不同的消息,而不是在它们之间循环接收来自 Q1 的消息,则 C1 和 C2 必须订阅不同的队列。
例如:
- 具有路由密钥 1 的 E1 应该转到 QC1
- 具有路由密钥 2 的 E1 应该转到 QC2
- C1 应该使用来自 QC1 的消息
- C2 应该使用来自 QC2 的消息
通过为消费者设置单独的队列,您将保证消息到达正确的消费者