【发布时间】:2014-10-06 02:32:16
【问题描述】:
我在面向服务的架构中使用 RabbitMQ 作为消息队列,其中许多单独的 Web 服务发布绑定到 RabbitMQ 队列的消息。这些队列依次由执行后台工作的各种消费者订阅; RabbitMQ 的一个非常普通的用例。
现在我想更改一些队列参数(具体来说,我想将队列绑定到具有特定路由键的新死信交换)。我的问题是,在生产系统上进行这种更改是有问题的,原因有几个。
在生产系统中,在不丢失消息的情况下过渡到这些新队列的最佳方式是什么?
我已经考虑了从版本控制队列名称到使用新设置创建新虚拟主机到进行所有更改的所有事情。
以下是我面临的一些问题:
因为 RabbitMQ 队列是幂等的,不同的 Web 服务在发布到它们之前已经声明了队列(以防它们不存在)。一旦更改了队列参数(但保持相同的路由键),队列声明失败,RabbitMQ 关闭通道。
我希望在更改队列时不会丢失消息(这里我计划订阅一个独占的消费者来保存消息然后重新发布到新队列)。
不同的发布者和消费者群之间的一般协调(或者,甚至更好的一种避免需要协调它们的方法)。
【问题讨论】: