如果我有一个RabbitMQ使用者批量检索100条消息,但是在它将这些消息标记为已处理之前它会崩溃,这些消息会丢失吗?我希望队列中的每条消息至少处理一次。什么是推荐的方法来处理在他们确认消息之前崩溃的消费者?
RabbitMQ是否会以某种方式将它们放回队列,或者我需要做些什么来实现它呢?
答案 0 :(得分:2)
处理崩溃的消费者的推荐方法是什么? 在他们确认消息之前?
让rabbitmq为您做一切 - 未确认的消息将重新排队,并将再次传递给另一个(甚至同一个)消费者。
RabbitMQ是否会以某种方式将它们放回队列,或者我需要什么 要做到这一点吗?
请参阅第一个问题的答案。在处理完这些消息之前,请不要承认这些消息。这意味着还要确保未设置auto_ack标志!
如果我有一个RabbitMQ消费者,批量检索100条消息,但是 然后它崩溃才能将这些消息标记为已处理,是 那些消息丢失了?
请参阅上面的答案 - 如果他们自动被确认,他们就会丢失。
只是一点参考,引用第二个tutorial:
如果消费者死亡(其渠道已关闭,连接已关闭,或者 没有发送确认的TCP连接丢失,RabbitMQ会 了解邮件未完全处理并将重新排队。 如果同时有其他在线消费者在线,那么就会 迅速将其重新发送给另一个消费者。那样你就可以肯定了 即使工人偶尔死亡,也不会丢失任何信息。
答案 1 :(得分:0)
如果消费者必须确认收到的消息,并且在消息收到之前消失,则会发生以下情况:
如果同一队列有多个使用者,或者您的RabbitMQ代理版本低于2.7.0,则第3点将无效。
希望它有所帮助。