1

我对 RabbitMQ 有一个有点独特的用例,但我不确定如何解决这个问题。我希望有一个绑定了多个消费者的队列,然后让 RabbitMQ 一次仅向一个消费者发送一条消息,并在向任何其他消费者发送另一条消息之前等待 ACK。

我意识到这会扼杀吞吐量,并且基本上会使其他消费者挨饿,但对我来说没关系。这个奇怪用例的原因是消费者与之交谈的服务一次只能处理一个并发请求,所以我需要一种方法来限制这一点,但消费者也可能意外死亡,我需要另一个消费者来接手处理消息如果发生这种情况。我知道有这个prefetch选项,但它仍然允许多个用户获得一个独占队列,但我不确定那些能完成我想要的。是否可以配置 RabbitMQ 来执行此操作?

4

1 回答 1

1

不; 没有办法限制同一队列中的竞争消费者,以便在收到 ack 之前,所有消费者都在处理一条且只有一条消息。

前段时间出现了一个类似的问题;我不记得它是在这里还是在 Spring 论坛中,但我相信解决方案是让消费者获得某种全局锁,使用 hazelcast 之类的东西,甚至是简单的数据库表行锁(prefetch=1所以每个消费者只有一个“处理中”消息,当每个消费者获得锁时都会处理该消息)。

于 2013-05-23T02:58:06.257 回答