【问题标题】:How to configure RabbitMQ bidirectional shovel and avoid infinite loop?如何配置 RabbitMQ 双向铲子,避免死循环?
【发布时间】:2018-10-07 06:44:33
【问题描述】:

我在不同的数据中心有 2 个 RabbitMQ 集群。目前,我们正在将其中一个交换从一只兔子转移到另一只兔子,但现在我们也需要朝另一个方向推进。我们如何在不导致无限循环的情况下实现这一点?

一位同事认为我们可以勾选“添加转发标头”选项,然后使用标头交换进行过滤。但是,添加的标头似乎是嵌套的,我还没有找到与标头匹配的方法?

【问题讨论】:

  • 您能否提供更多有关您的用例的背景信息?你选择铲子和federation有什么原因吗?
  • 只是我们已经在使用铲子并且熟悉它。对联邦不太熟悉,我会研究一下。本质上,我们在每个数据中心都有一只兔子,每只兔子都有一个生产者用相同的名字写来交换。然后,我们将队列绑定到这些交换,我们需要这些队列包含来自两个生产者的所有消息。所以我们需要复制两种方式,但需要避免复制已经复制的消息。

标签: rabbitmq rabbitmq-shovel


【解决方案1】:

似乎基于您提供的附加描述:

  • 您在交易所之间使用铲子
  • 猜测交换类型是扇出

我可以看到两种方法来处理您正在尝试做的事情:

  • 使用federation,并在每个集群的交换机之间双向配置
  • 仍然使用铲子,但在每个交换器上定义一个新队列并配置队列到队列铲

对于铲子选项: 您在集群 1 上有交换 A,在集群 2 上有交换 A, 每个集群上的 main_queue

  • 在每个集群上创建一个secondary_queue,绑定到exchange A。
  • 创建一个从集群 1 上的辅助队列到集群 2 上的 main_queue 的铲子
  • 创建一个从集群 2 上的辅助队列到集群 1 上的 main_queue 的铲子

联合的好处:更简单,即使您配置了复杂的路由

铲子的好处:如果您有重大连接中断的风险(我会说超过一分钟),那就更好了。在这种情况下,您不会丢失消息,而在联合情况下可能会发生某些消息不会在两个集群上复制的情况。

【讨论】:

  • 嗨 Olivier - 感谢您的回答。您的铲子解决方案看起来很有趣,但是当我说队列绑定时,我的意思是多个队列,因为有多个应用程序需要所有消息。不过考虑一下,我想这可能是与它后面的队列的交换。缺点是它需要对现有的生产者应用程序进行更改。我肯定会调查联邦,但担心消息的潜在丢失。仍然非常渴望听到使用交换标头匹配的解决方案。你熟悉这个吗?
  • 嗨@Tom,我是 RabbitMQ 的忠实用户,所以虽然我希望我制作的 cmets 可以帮助你,但我离专家水平还差得很远。考虑到这一点,我绝对建议研究联邦,因为从一些额外的阅读中似乎可以让它容忍与某些参数的严重断开。关于标头交换,我没有使用它们,尽管我知道它们的逻辑。最后,如果没有关于您的设置的其他详细信息,特别是您使用的交易所类型和队列数量,很难做出“好的”推荐。
  • 最终使用了您的二级队列方法的变体,该方法引入了第二级交换,并创建了一个挂在上级交换之外的队列,该队列被铲到另一个代理上的下级交换。
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2015-10-14
  • 2019-08-24
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多