当autoAck = true时,可以看到飞行中的rabbitmq消息数量

时间:2014-10-14 10:46:17

标签: rabbitmq

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

现在我正在研究消费者可以处理消息的速率低于发送消息的速度。

过了一会儿,(大量)积压的消息必须在某处排队。有没有办法在这个积压工作中获得可见性?

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

Ready: 0
Unacknowledged: 0
Total: 0

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

channel.basicQos(10)

也没有帮助,可能是因为这只限制了未确认的消息,并且使用autoAck = true,消息从客户端预取的那一刻开始就被激活。

设置autoAck = false(并在交付时显式确认)是一个解决方案(Unacknowledged计数器继续上升),但我想知道这是否是唯一的方法?

最好我想限制客户端缓存消息的数量而不管确认,以便最终通过rabbitmqmanagement接口显示积压。

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

1 个答案:

答案 0 :(得分:1)

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

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