【发布时间】:2014-06-25 17:30:50
【问题描述】:
在使用 ack 时,是否有一种简单的方法来实现诸如“锁定”之类的东西来防止 RabbitMQ 队列中的竞争条件?
我有以下问题 - 我有几个客户使用 ack 来消费队列。每当客户收到消息时,他都会确认并处理它。但是,如果由于某种原因处理失败,我希望将消息返回到队列中。
【问题讨论】:
-
如果你是在ack-mode下消费,那么当消费者确认消息失败时,消息会被放回队列中。这是 RabbitMQ 的默认行为。你有什么不一样的经历吗?
-
是的,但是如果您有一些处理工作要做,这可能由于某种原因而失败 - 比如说您需要一秒钟左右的时间来处理消息。如果在第一次收到消息时就确认消息,如果处理失败,则消息将永远不会被成功处理。如果您在完成处理后确认消息,您可能会冒另一个工作人员在您回复之前抓住并处理它的风险,并且该消息将被处理两次。
-
是的。这就是为什么消费者应该尽可能地幂等的原因之一。
-
如果你没有ack,rabbit不会发送给第二个消费者。可能会发生ack无法到达,然后在重新连接通道时再次发送消息。
标签: rabbitmq