AMQP/RabbitMQ-按顺序处理消息

AMQP/RabbitMQ-按顺序处理消息,rabbitmq,amqp,high-availability,Rabbitmq,Amqp,High Availability,我有一个直接交换。还有一个队列绑定到此交换 我有两个消费者在排队。消费者在完成相应的处理后手动确认消息 消息按逻辑顺序排列/排序,并应按该顺序进行处理。是否可以强制消费者A和消费者B按顺序接收和处理所有消息?换句话说,防止A和B同时处理消息 注意:消费者不共享相同的连接和/或通道。这意味着我不能使用.basicQoS(1) 这个问题的理由:两个消费者都是相同的。如果一个队列发生故障,另一个队列将开始处理消息,并且一切都将继续工作,而无需任何必要的干预。通常MQ系统的重点是分配工作负载。当然,在某

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

我有两个消费者在排队。消费者在完成相应的处理后手动确认消息

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

注意:消费者不共享相同的连接和/或通道。这意味着我不能使用
.basicQoS(1)


这个问题的理由:两个消费者都是相同的。如果一个队列发生故障,另一个队列将开始处理消息,并且一切都将继续工作,而无需任何必要的干预。

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

如果A和B不能同时处理消息,那么为什么不使用A或B呢?在我看来,拥有两个消费者并不能节省任何东西,一个消费者只能在另一个消费者不在的情况下工作

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


只需补充一点,RMQ将消息均匀地分发给所有消费者(以循环方式),而不考虑任何标准。当然,这是当预取设置为1时,默认情况下为1。有关这方面的更多信息,请查看“公平调度”。

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

过程是这样的:

  • 使用者A首先启动并作为独占使用者绑定到队列。使用者A开始处理队列中的消息
  • 使用者B下一步启动并尝试作为独占使用者绑定到队列,但被拒绝,因为队列已经有独占使用者
  • 消费者B反复尝试在队列上获得独占绑定,但被拒绝
  • 承载使用者A的进程崩溃
  • 使用者B尝试作为独占使用者绑定到队列,这次成功。使用者B开始处理队列中的消息
  • 消费者A重新联机,并尝试独占绑定,但现在被拒绝
  • 消费者B继续以FIFO顺序处理消息

  • 虽然这种方法不提供负载共享,但它确实提供了冗余。

    尽管这已经得到了回答。也许这可以帮助别人。 ActiveMQ有一个称为单活动使用者的功能,它与您的情况相匹配

    我们可以将N个消费者连接到一个队列,但其中只有1(一)个消费者将积极地消费队列中的消息。故障转移仅在活动耗电元件发生故障时发生

    请看一下链接


    谢谢你

    谢谢你的见解。回到您的问题
    那么为什么不只使用A或B
    :您的理解是正确的,即
    A
    B
    不应同时处理消息。所以它确实是
    A或B
    。但是,我认为同时运行
    A
    B
    会很有用:如果
    A
    (或
    B
    )崩溃,系统可以继续运行,而无需任何(手动)干预。我从你那里了解到,我的方法实际上是不可能的。但接下来的问题是:我如何促进从
    a
    (或
    B
    )到
    B
    (或
    a
    )的正确故障切换?不客气。更容易的方法是为
    a
    设置一个监视代理(看门狗),如果它崩溃,它将重新启动,然后以任何方式从
    a
    故障切换到
    B
    。消息不会丢失,它们将留在队列中,并在消费者再次起床时发送。好的,收到了。RabbitMQ是否提供高级故障转移功能?我知道有管理插件和RESTAPI,但那只是监控(afaik)。是否有任何插件/库/工具(RabbitMQ或第三方)用于自动故障转移,您会建议从中开始?我不知道故障转移功能,这是客户端,因此我认为服务器不应该负责这一点。可能是有一些插件,但我从来没有需要过这样的东西,所以从来没有查过。RabbitMQ确实有一个心跳(实际上是一个AMQP特性)检查——也许这对您有些用处。但是,在任何操作系统上编写看门狗都应该很容易——举个例子:每n秒拉一次进程列表,看看消费者是否在那里,如果没有启动它。好的,谢谢。首先,我将研究heartbeat特性。我将把这个问题留待几天,以防其他人有更具体的答案。再次感谢。单个活跃消费者如何?多个使用者绑定,但所有消息只发送到第一个使用者。如果它死了,那么消息被发送到第二个。您得到了冗余,并且处理顺序得到了保留。单个活动使用者看起来确实比独占绑定更干净,但确实需要RabbitMQ 3.8