繁体   English   中英

在Rabbit MQ中切换路由

[英]Toggle routing in Rabbit MQ

在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)。

我能想到的唯一解决方法是在绑定切换之前暂时使交换X不可用(ACL?重命名?),并希望客户端处理错误条件。

是否有一种开箱即用的方式来实现这一目标? 如果没有,你会推荐什么方法?

也许你想要像rabbitmq分片插件 (也在同一个链接)提供的一致哈希交换或模数哈希交换。

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

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

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

请注意,如果您的X交换上有其他备用交换,确切的步骤可能会有所不同,但这个想法仍然相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM