【问题标题】:rabbitmq consumer getting messages of different routing keyrabbitmq 消费者获取不同路由键的消息
【发布时间】:2015-12-03 04:56:04
【问题描述】:

我们有两个消费者通过 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)的消息......这里有问题。

【问题讨论】:

    标签: php routing rabbitmq consumer publisher


    【解决方案1】:

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

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

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

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

    例如:

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

    通过为消费者设置单独的队列,您将保证消息发送到正确的消费者

    【讨论】: