2014-10-01 62 views
1

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

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?rename?),并希望客户端处理错误情况。

是否有一个干净的实现这个开箱即用的方式? 如果不是,您会推荐什么方法?

+0

当我通过翻转绑定来破坏切换时,我每隔300毫秒就会丢失大约2000条消息,而每隔300毫秒切换一次。 – Frederik 2014-10-03 11:45:19

回答

1

切换绑定可能与Alternate Exchangs的RabbitMQ扩展的帮助来完成:

  1. 创建额外的交换,说X-AE并结合Q2X-AE
  2. 设置X-AE作为Alternate ExchangeX交换(将所有消息(无法处理的消息)路由到Q2队列)。
  3. 取消绑定Q1X(消息将通过X-AE流向Q2)。
  4. 绑定Q2X
  5. X删除替代交换X-AE策略交换。
  6. 解除绑定Q2X-AE删除X-AE交换。

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

+0

这工作得很好。在我的测试中,我曾经注意到有一次可能会丢失信息,但这是微不足道的:在15kHz发送一百万条信息,每50ms切换一次(预期切换速率每小时一次)。实现起来有点痛苦,C#Pivotal RabbitMQ客户端不支持策略设置/丢弃,因此您必须通过管理API上的REST执行此操作。也没有找到一个很好的方式来设置每个交易所的AE政策。该API似乎要求您全局处理AE策略定义(不是并发友好的) – Frederik 2014-10-03 11:32:53

2

也许你想要类似consistent hashing exchangerabbitmq分片插件(也在同一链接)提供的模数散列交换。

这些插件负责分区流,这似乎是你想要做的事情。

+0

我没有试图对流进行分区 - 我需要在特定时间由特定队列使用者处理整个流。虽然有趣的插件。 – Frederik 2014-10-03 11:42:16