当RabbitMQ消费者崩溃时,获取的消息会发生什么变化?

时间:2017-02-21 18:21:31

标签: queue rabbitmq message-queue amqp

如果我有一个RabbitMQ使用者批量检索100条消息,但是在它将这些消息标记为已处理之前它会崩溃,这些消息会丢失吗?我希望队列中的每条消息至少处理一次。什么是推荐的方法来处理在他们确认消息之前崩溃的消费者?

RabbitMQ是否会以某种方式将它们放回队列,或者我需要做些什么来实现它呢?

2 个答案:

答案 0 :(得分:2)

  

处理崩溃的消费者的推荐方法是什么?   在他们确认消息之前?

让rabbitmq为您做一切 - 未确认的消息将重新排队,并将再次传递给另一个(甚至同一个)消费者。

  

RabbitMQ是否会以某种方式将它们放回队列,或者我需要什么   要做到这一点吗?

请参阅第一个问题的答案。在处理完这些消息之前,请不要承认这些消息。这意味着还要确保未设置auto_ack标志!

  

如果我有一个RabbitMQ消费者,批量检索100条消息,但是   然后它崩溃才能将这些消息标记为已处理,是   那些消息丢失了?

请参阅上面的答案 - 如果他们自动被确认,他们就会丢失。
只是一点参考,引用第二个tutorial

  

如果消费者死亡(其渠道已关闭,连接已关闭,或者   没有发送确认的TCP连接丢失,RabbitMQ会   了解邮件未完全处理并将重新排队。   如果同时有其他在线消费者在线,那么就会   迅速将其重新发送给另一个消费者。那样你就可以肯定了   即使工人偶尔死亡,也不会丢失任何信息。

答案 1 :(得分:0)

如果消费者必须确认收到的消息,并且在消息收到之前消失,则会发生以下情况:

  1. RabbitMQ经纪人将知道消费者不会承认,因为该频道已关闭。
  2. 它会将邮件标记为未送达。
  3. 保留队列中消息的顺序。
  4. 队列中的消息将在下次连接时发送给消费者。
  5. 如果同一队列有多个使用者,或者您的RabbitMQ代理版本低于2.7.0,则第3点将无效。

    希望它有所帮助。