AMQP / RabbitMQ - 按顺序处理消息

时间:2016-05-30 08:10:08

标签: rabbitmq amqp high-availability

我有一个直接交换。还有一个队列,绑定到此交换。

我有两个消费者为该队列。一旦消息完成相应的处理,消费者就会手动确认消息。

消息按逻辑顺序排序/排序,应按此顺序处理。是否有可能强制所有消息按消费者A和消费者B顺序接收和处理?换句话说,防止A和B同时处理消息。

注意:消费者共享相同的连接和/或频道。这意味着我无法使用<channel>.basicQoS(1);

这个问题的基本原理:两个消费者都是相同的。如果一个发生故障,另一个队列就会开始处理消息,一切都会继续工作而不需要任何干预。

3 个答案:

答案 0 :(得分:2)

在您需要冗余消费者但需要按特定顺序处理消息的情况下处理故障转移的一种方法是在设置绑定到队列时使用独占消费者选项,并让两个持续尝试的消费者即使他们无法获得排他锁,也要绑定。

这个过程是这样的:

  1. 消费者A首先启动并作为独占消费者绑定到队列。消费者A开始处理来自队列的消息。
  2. 消费者B接下来开始尝试以独占消费者身份绑定到队列,但由于队列已经拥有独占消费者而被拒绝。
  3. 在定期的基础上,消费者B尝试在队列中获得独占绑定但被拒绝。
  4. 处理托管消费者A崩溃。
  5. 消费者B尝试作为独占消费者绑定到队列,并且这次成功。消费者B开始处理来自队列的消息。
  6. 消费者A重新上线,尝试独占绑定,但现在被拒绝。
  7. 消费者B继续按FIFO顺序处理消息。
  8. 虽然这种方法不提供负载共享,但它确实提供了冗余。

答案 1 :(得分:0)

通常,MQ系统的重点是分配工作负载。当然,在某些情况下,消息N的处理取决于处理消息N-1的结果,甚至是N-1消息本身。

如果A和B不能同时处理消息,那么为什么不只有A或只有B?正如我所看到的那样,你并没有拯救任何东西,只有在另一个消费者没有的情况下才能使用2个消费者......

在您的情况下,最好有一个消费者,但实际上在处理部分上进行并行化(实际上不是一个字)。

只是补充说,RMQ正在向所有消费者(以循环方式)均匀地分发消息,而不管任何标准。当然这是预取设置为1,默认情况下是。关于here的更多信息,请查找“公平派遣”。

答案 2 :(得分:0)

即使这已经是答案。也许这可以帮助别人。 ActiveMQ具有称为“单个活动使用者”的功能,可以与您的情况相匹配。

我们可以将N个使用者附加到一个队列,但是只有1个(其中一个)将积极使用该队列中的消息。仅当活动使用者失败时才会发生故障转移。

请看看链接https://www.rabbitmq.com/consumers.html#single-active-consumer

谢谢