首页 > 解决方案 > 如何在 RabbitMQ 中替换队列而不丢失或复制生产中的事件

问题描述

假设我们有一个绑定到交换 E 的队列 A。现在我们想用队列 B 或者甚至可能用两个使用不同绑定键的队列 B 和 C 替换队列。为简单起见,我们采用更简单的情况,我们只想用 B 替换 A。

有没有办法在不丢失或重复事件的情况下实现这一点?例如,我们能否以某种方式发出绑定更改事务,以原子步骤移除与队列 A 的绑定并为队列 B 添加绑定?

我假设传入消息的连续流。如果生产者在我添加新队列时继续生产,然后解除绑定我假设的旧队列,我将冒着在添加新绑定和删除旧绑定之间发生的事件重复的风险。反过来,删除旧队列的绑定,然后添加新队列的绑定,我假设我冒着丢失中间消息的风险。

标签: rabbitmq

解决方案


“丢失或复制事件”似乎与您的订阅者的实现方式有关,而不是 RabbitMQ。

例如,如果您停止使用消息,然后将消息移动到不同的队列(按顺序),然​​后才在新队列上重新启动订阅者,您将不会丢失消息。

您也可以简单地让“旧”订阅者消费“A”队列,直到其中没有消息,而“新”订阅者仅从队列“B”消费,最终停用旧队列和订阅者。

我们能否以某种方式发出一个绑定更改事务,删除与队列 A 的绑定并在原子步骤中添加队列 B 的绑定?

不。

RrabbitMQ 文档中,在表中:

事务交换/队列/绑定创建/删除:

如果在交换消费者时不能停止生产者,事情就会变得复杂。如果这真的不可能并且您绝对必须保持订单,您可以引入一个额外的缓冲区队列,也许使用铲子插件来消耗它。编排此类更改将涉及首先停止铲子,因此可以完全消耗 A 队列。

如果它是一次性的,我只会这样做,但我不希望这成为我的部署管道的一部分。如果没有所有上下文,您似乎冒着在这里重新实现 Kafka 的风险。


推荐阅读