AMQP/RabbitMQ -按顺序处理消息

xdnvmnnf  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(3)|浏览(248)

我有一个 direct exchange。还有一个队列,绑定到此exchange。
这个队列有两个消费者,消费者在完成相应的处理后,会手动确认消息。
消息已按逻辑顺序排列/排序,并且应按该顺序进行处理。是否可以强制使用者A和使用者B按顺序接收和处理所有消息?换句话说,防止A和B同时处理消息。
注意:消费者共享相同的连接和/或通道。这意味着我不能使用<channel>.basicQoS(1);
该问题的理由:两个使用者是完全相同的。2如果一个出现故障,另一个队列开始处理消息,并且所有的东西都可以继续工作,而不需要任何干预。

fivyi3re

fivyi3re1#

在需要冗余使用者但需要以特定顺序处理消息的情况下,处理故障转移的一种方法是在设置到队列的绑定时使用独占使用者选项,并让两个使用者即使在无法获得独占锁时也不断尝试绑定。
其过程大致如下:
1.使用者A首先启动,并以独占使用者的身份绑定到队列。使用者A开始处理队列中的消息。
1.取用者B接着启动,并尝试以独占取用者的身份系结至队列,但遭到拒绝,因为队列已经有独占取用者。
1.在循环的基础上,消费者B尝试在队列上获得独占绑定,但被拒绝。
1.装载消费者A的行程序死机。
1.使用者B尝试以独占使用者身份绑定到队列,这次成功了。使用者B开始处理队列中的消息。
1.消费者A被恢复联机,并尝试独占绑定,但现在被拒绝。
1.消费者B继续以FIFO顺序处理消息。
虽然这种方法不提供负载共享,但它确实提供了冗余。

but5z9lq

but5z9lq2#

尽管这已经被回答了。也许这可以帮助其他人。RabbitMQ有一个被称为单一主动消费者的特性,它符合您的情况。
我们可以将N个使用者连接到一个队列,但其中只有一个会主动使用队列中的消息。只有当主动使用者失败时,才会发生故障转移。
请查看链接https://www.rabbitmq.com/consumers.html#single-active-consumer
谢谢你

p5cysglq

p5cysglq3#

通常MQ系统的重点是分配工作量,当然也有一些情况下N消息的处理依赖于N-1消息的处理结果,甚至是N-1消息本身。
如果A和B不能同时处理消息,那么为什么不只使用A或B呢?在我看来,使用两个消费者,一个只能在另一个不能工作的情况下工作,并不能节省任何东西...
在您的情况下,最好有一个消费者,但实际上在处理部分进行并行化(实际上不是一个字)。
只需补充一点,RMQ将消息均匀地分发给所有使用者(以循环方式),而不考虑任何标准。当然,这是在prefetch设置为1时,默认情况下是这样的。有关here的更多信息,请查找“fair dispatch”。

相关问题