当 RabbitMQ 消费者崩溃时,获取的消息会发生啥?

Posted

技术标签:

【中文标题】当 RabbitMQ 消费者崩溃时,获取的消息会发生啥?【英文标题】:What happens to fetched messages when RabbitMQ consumer crashes?当 RabbitMQ 消费者崩溃时,获取的消息会发生什么? 【发布时间】:2017-07-11 12:44:41 【问题描述】:

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

RabbitMQ 是否以某种方式将它们放回队列中,或者我需要做些什么才能让它发生?

【问题讨论】:

如果消费者崩溃,消息将被放回队列.. @redflar3 怎么知道消费者崩溃了? 【参考方案1】:

对于在确认消息之前就崩溃的消费者,推荐的处理方法是什么?

让 rabbitmq 为你做所有的事情 - 不是的消息 确认被重新排队并将再次交付给另一个(或 甚至相同)消费者。

RabbitMQ 是否以某种方式将它们放回队列中,或者我需要做什么才能让它发生?

查看第一个问题的答案。根本不承认消息 在他们被处理之前。这也意味着确保 auto_ack 标志未设置!

如果我有一个 RabbitMQ 消费者批量检索 100 条消息,但它在将这些消息标记为已处理之前就崩溃了,这些消息会丢失吗?

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

如果消费者在没有发送 ack 的情况下死亡(其通道关闭、连接关闭或 TCP 连接丢失),RabbitMQ 将理解消息未完全处理并将重新排队。如果同时有其他消费者在线,它会迅速将其重新发送给另一个消费者。这样,即使工人偶尔死亡,您也可以确保不会丢失任何消息 .

【讨论】:

"未确认的消息被重新排队并将再次传递" - 它是如何做到这一点的,如果确认没有到达一定数量的时间,它是否重新排队消息时间? 基本上,如果 rmq 检测到连接断开,它会为该消费者重新排队所有 msg。 能否请您指出文档的部分或描述此行为的任何地方? 我已经编辑了答案,有教程链接 在这种情况下,您是否知道消息是否会重新排队到队列的开头或结尾,这意味着它们会在队列中其他所有内容之前或之后被下一个消费者提取吗?与您 rejectnack 将 requeue 设置为 true 的消息时的行为相同吗?【参考方案2】:

如果消费者必须确认收到的消息,并且在它这样做之前就死了,则会发生以下事情:

    RabbitMQ 代理会知道消费者不会确认,因为通道已关闭。 它将邮件标记为未送达。 保留队列中消息的顺序。 队列中的消息将在下次连接时发送给消费者。

如果同一队列有多个消费者,或者您的 RabbitMQ 代理版本低于 2.7.0,第 3 点将无效。

希望对你有帮助。

【讨论】:

以上是关于当 RabbitMQ 消费者崩溃时,获取的消息会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ:在 pub/sub 中,消费者是轮询队列以获取新消息还是服务器推送消息?

当 rabbitmq-server 崩溃时,rabbitmq 服务器会恢复标记为持久队列的消息吗?

我的RabbitMQ学习(消息持久性)

RabbitMQ消息中间件9.通配符模式

RabbitMQ简介与springboot整合

使用SpringCloud Stream结合rabbitMQ实现消息消费失败重发机制