【问题标题】:Getting currently unacknowledged consumer messages in RabbitMQ在 RabbitMQ 中获取当前未确认的消费者消息
【发布时间】:2020-03-11 16:28:00
【问题描述】:

我正在尝试优雅地关闭一个从 RabbitMQ 消耗消息的进程。我知道我可以使用Channel.cancel 来阻止 RabbitMQ 向进程发送任何新消息,但我还需要处理任何待处理的、未确认的消息。我可以直接调用Channel.nackAll 并将它们全部重新排队,但如果我可以等到所有待处理的消息(已被消费但尚未确认/确认的消息)完成后会更好。

任何想法如何实现这一目标?

【问题讨论】:

    标签: rabbitmq amqp sigterm


    【解决方案1】:
    • 取消消费者
    • 在工作完成后确认您当前正在“处理”的消息
    • 完成上述操作后,关闭通道和连接。任何未确认的内容都将由 RabbitMQ 重新排队。

    注意:RabbitMQ 团队会监控 rabbitmq-users mailing list,并且仅有时会回答 * 上的问题。

    【讨论】:

    • 我如何知道所有待处理的工作都已完成?发生这种情况时有什么方法可以解决吗?
    • 您的应用程序正在处理每条消息。这就是我所说的“待定工作”。
    • 是的,但是我如何知道所有待处理的工作何时完成? AFAIK 在 RabbitMQ 中没有“获取当前消耗但尚未确认的消息的计数”方法。我可以在代码中手动跟踪传入/处理的消息,但它似乎有点脆弱(其中一条消息由于某种原因被跳过,并且在整个过程期间计数关闭)。
    • 由您的应用程序来跟踪。您应该设置一个 QoS / 预取值,以便您知道 RabbitMQ 将允许您的消费者通道上的未确认消息的最大数量。
    • 我想这回答了我的问题 - RabbitMQ 无法获取(至少是数量)当前收到但尚未确认/确认的消息。