python - RabbitMQ:双向联合代理,如何让所有队列弹出消息?

标签 python rabbitmq messagebroker rabbitmq-federation

我有两个代理[1]配置了联合插件。两者都指向对方作为上游。

我的测试是:

  • 在代理 A 上发布消息
  • 在经纪商 B 上消费

结果是:

  • 在经纪商 B 上消费是有效的
  • <好>代理 B 上的队列弹出消息
  • <不好>代理A上的队列仍然有消息
    • <这不好的原因>我看到的问题是:如果我总是在一个代理上发布,然后总是在另一个代理上消费 --> 那么发布代理上的队列将增长,直到满并开始丢弃消息.

我想要的结果是:

  • 当消费者在代理 B 上消费时,代理 A 和 B 上的两个队列都会弹出消息

当消费者在代理 B 上消费消息时,如何配置 RabbitMQ 以从所有队列中弹出消息? 现在我正在尝试使用 RabbitMQ Federation 插件来实现此目的。

<小时/>

[1] 两个代理相互指向对方作为上游,我将它们配置为 same way as described in the "simple example" given by the documentation只不过有两个经纪人各自指向对方作为上游。 code for the publisher looks like thiscode for the consumer looks like this .

最佳答案

@Trevor Boyd Smith,您可能可以考虑如下所示的选项 2 或 3。

选项1:双向联合交易所

消息最终将同时到达代理 A 和 B,每个代理各有一个副本,彼此独立。换句话说,例如,即使在代理 B 将消息传递给其消费者之后,消息的另一个副本仍然保留在代理 A 中。

优点:您将始终拥有消息的两份副本,每个代理各一份,这是高度可用的。

缺点:您需要有一个消费者连接到每个代理。

选项 2:双向联合队列

消息将最终到达两个代理之一。默认情况下,已发布消息的 Broker 将优先将消息入队;但是,如果只有另一个代理有消费者,则消息将移动到另一个代理。

无论消息最终到达哪个代理,消息都会由连接到任一代理的消费者传递一次且仅一次。

优点:消息将被传递一次,且仅传递给连接到任一代理的消费者。

缺点:消息只有一份副本。如果收到消息的 Broker 发生故障,其他 Broker 将无法收到消息。但如果您对最终一致性没问题,那么这个选项就可以了。原因是当有问题的代理恢复运行时,该消息最终将可用。

选项 3:双向联合交换和队列

在这种情况下,一条消息将最终出现在两个代理中,每个代理各有一个副本。相同的消息将被传递给连接到任一代理的消费者两次!一旦消息被传递两次,它将在两个代理中消失。 (如果有两个消费者,一个连接到每个代理,则每个代理将向其消费者传递相同的消息一次。)

enter image description here

优点:消费者可以连接到任一代理,每个代理中的消息都将被传递并出队。

缺点:同一条消息将被传送两次。解决方法是,在处理消息之前,检查是否已处理相同的消息。

注意:

这并不意味着哪个选项比其他选项更好。这完全取决于您的用例,并且还有许多其他配置可以发挥作用,这可能会改变行为。

关于python - RabbitMQ:双向联合代理,如何让所有队列弹出消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33620219/

相关文章:

python - 使用Python的浅水模型

python - 导入 beautifulsoup 时出错

rabbitmq - Spring 集成和 AMQP : How to gracefully handle deserialization exceptions?

RabbitMQ:忽略 prefetch() 会导致数据并发吗?

java - RabbitMQ+SpringAMPQ : Receiving multiple queues in SimpleMessageListenerContainer

python - 字典中的关系元组列表

javascript - RabbitMQ 在网站上向用户发送消息

java - JMS 连接到没有任何特定库的队列

redis - 如何在 Apache ActiveMQ 中只获取组中的最后一条消息?

python - 为什么@property 比属性慢,而字节码是相同的