rabbitmq - 如何在 RabbitMQ 中替换队列而不丢失或复制生产中的事件
问题描述
假设我们有一个绑定到交换 E 的队列 A。现在我们想用队列 B 或者甚至可能用两个使用不同绑定键的队列 B 和 C 替换队列。为简单起见,我们采用更简单的情况,我们只想用 B 替换 A。
有没有办法在不丢失或重复事件的情况下实现这一点?例如,我们能否以某种方式发出绑定更改事务,以原子步骤移除与队列 A 的绑定并为队列 B 添加绑定?
我假设传入消息的连续流。如果生产者在我添加新队列时继续生产,然后解除绑定我假设的旧队列,我将冒着在添加新绑定和删除旧绑定之间发生的事件重复的风险。反过来,删除旧队列的绑定,然后添加新队列的绑定,我假设我冒着丢失中间消息的风险。
解决方案
“丢失或复制事件”似乎与您的订阅者的实现方式有关,而不是 RabbitMQ。
例如,如果您停止使用消息,然后将消息移动到不同的队列(按顺序),然后才在新队列上重新启动订阅者,您将不会丢失消息。
您也可以简单地让“旧”订阅者消费“A”队列,直到其中没有消息,而“新”订阅者仅从队列“B”消费,最终停用旧队列和订阅者。
我们能否以某种方式发出一个绑定更改事务,删除与队列 A 的绑定并在原子步骤中添加队列 B 的绑定?
不。
从RrabbitMQ 文档中,在表中:
事务交换/队列/绑定创建/删除: 否
如果在交换消费者时不能停止生产者,事情就会变得复杂。如果这真的不可能并且您绝对必须保持订单,您可以引入一个额外的缓冲区队列,也许使用铲子插件来消耗它。编排此类更改将涉及首先停止铲子,因此可以完全消耗 A 队列。
如果它是一次性的,我只会这样做,但我不希望这成为我的部署管道的一部分。如果没有所有上下文,您似乎冒着在这里重新实现 Kafka 的风险。
推荐阅读
- javascript - Vuepress 从 .md 文件标题创建 H1
- azure - UNABLE_TO_VERIFY_LEAF_SIGNATURE 即使 SonarQube 位于应用程序网关后面并带有 SSL 终止
- javascript - 如何访问 css 以在 javascript Vue JS 中进行动画处理
- docker - RabbitMQ **WARNING** 由 docker-entrypoint.sh 生成
- c - 使用 write() 打印字母表
- php - PHP SQL Server十进制/数字不能以0开头
- arrays - 将单元格数据移动到不同的工作表中
- javascript - 在 Javascript 中通过多个嵌套数组进行交互
- python - Django:如何用超过 1 个参数定义变换?
- javascript - Three.js / jsCAD:如何平滑网格法线以获得轮廓效果?