在Rabbit MQ中切换路由

本文关键字:路由 Rabbit MQ | 更新日期: 2023-09-27 18:25:08

在RabbitMQ中,是否有一种方法可以像下面的设置一样原子地切换队列的绑定以进行交换。Q1&Q2交替绑定。

X -> Q1
  -> Q2

通过在交替的基础上绑定,它产生了一个问题,即如果Q1&Q2在切换期间同时绑定,或者如果两者都不绑定则丢失。要求是不要丢失或重复邮件。我意识到丢失信息的窗口很小,但我宁愿不处理随之而来的逻辑问题。

实际上,我想要实现的是一种从交换机X到队列(Q1或Q2)的路由形式,但不是让发布消息的应用程序关注这一点,后者发布到交换机X。

实现这一点的一种方法是使进程消耗消息离开中间队列Q,并通过给Q1和Q2各自一个交换来实现该进程中的切换路由。

这让我觉得效率低下,而且会导致更多的运动部件出错。

另一种方法是编写一个自定义交换,当没有绑定队列(X->Q1或X->Q2),但我的Erlang不存在时,该交换充当缓冲区/队列。

最简单的方法是在X->Q1和X->Q2之间切换绑定,但(afaik)没有绑定的原子切换,消息可能会丢失(先绑定Q1,然后绑定Q2)或重复(先绑定Q2,然后取消绑定Q1)。

我能想到的唯一解决办法是在绑定切换之前暂时使exchange X不可用(ACL?rename?),并希望客户端处理错误情况。

有没有一种开箱即用的方法可以干净地实现这一点?如果没有,你会推荐什么方法?

在Rabbit MQ中切换路由

也许您想要类似于rabbitmqsharding插件提供的一致哈希交换或模哈希交换(也在同一链接中)。

这些插件负责对流进行分区,这似乎是您实际想要做的。

切换绑定可以在Alternate Exchangs RabbitMQ扩展的帮助下完成

  1. 创建额外的交换,比如X-AE,并将Q2绑定到X-AE
  2. X-AE设置为X交换机上的备用交换机(将所有消息(无法处理的消息)路由到Q2队列)
  3. X取消绑定Q1(来自的消息将通过X-AE流到Q2
  4. Q2绑定到X
  5. X交换机中删除备用交换机X-AE策略
  6. 解除Q2X-AE的绑定,并移除X-AE交换

请注意,如果您的X交换机上有其他一些备用交换机,则具体步骤可能会有所不同,但想法仍然相同。