【问题标题】:Get visibility on number of rabbitmq messages in flight when autoAck=true当 autoAck=true 时,可以看到正在运行的 rabbitmq 消息的数量
【发布时间】:2014-10-14 10:46:17
【问题描述】:

我有一个 RabbitMQ 设置,其中(java)生产者将消息发送到由消费者处理的扇出交换。如果消费者死亡时消息丢失也没有问题,所以为了性能,我在消费者端设置了 autoAck=true。

现在我正在调查消费者可以处理消息的速率低于发送它们的速率的情况。

一段时间后,(大量)积压的消息必须在某个地方排队。有没有办法让这个积压工作可见?

使用rabbitmqmanagement接口不起作用:队列显示为空

Ready: 0
Unacknowledged: 0
Total: 0

我假设队列是空的,因为消息由消费者使用的 rabbitmqclient (无限制地)预取。但是通过例如限制预取

channel.basicQos(10)

也无济于事,可能是因为这只限制了未确认的消息,并且在 autoAck=true 的情况下,消息从客户端预取的那一刻起就被确认。

设置 autoAck=false(并在交付时明确确认)是一种解决方案(未确认的计数器不断上升),但我想知道这是否是唯一的方法?

最好我想限制客户端缓存消息的数量,而不考虑确认,以便积压最终通过rabbitmqmanagement界面变得可见。

或者,有没有办法查询位于客户端预取队列中某处等待传递的消息数量?

【问题讨论】:

  • basicQos 不适用于 autoAck=true,因为 basicQos 依赖于它。

标签: rabbitmq


【解决方案1】:

我建议结合使用 basicQos 和 autoAck=false。这将使所有内容都通过管理网站和 REST API 显示在队列中。向每个消费者发送无限数量的消息似乎破坏了队列的意义。

如果您的队列对时间敏感,您还可以在队列上添加 TTL,以便消息在(例如)60 分钟后自动 Nack。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多