我有一个RabbitMQ设置,其中(java)生产者将消息发送到扇出交换机,由消费者处理。如果消费者在消费者死亡时丢失消息就没问题了,所以为了性能,我在消费者端设置了autoAck = true。
现在我正在研究消费者可以处理消息的速率低于发送消息的速度。
过了一会儿,(大量)积压的消息必须在某处排队。有没有办法在这个积压工作中获得可见性?
使用rabbitmqmanagement接口不起作用:队列显示为空
Ready: 0
Unacknowledged: 0
Total: 0
我假设队列是空的,因为消费者使用的rabbitmqclient(无限制地)预取了这些消息。但是通过例如限制预取。
channel.basicQos(10)
也没有帮助,可能是因为这只限制了未确认的消息,并且使用autoAck = true,消息从客户端预取的那一刻开始就被激活。
设置autoAck = false(并在交付时显式确认)是一个解决方案(Unacknowledged计数器继续上升),但我想知道这是否是唯一的方法?
最好我想限制客户端缓存消息的数量而不管确认,以便最终通过rabbitmqmanagement接口显示积压。
或者,有没有办法查询位于客户端预取队列中某处等待传递的消息数量?
答案 0 :(得分:1)
我建议使用basicQos和autoAck = false的组合。这将使所有内容都通过管理网站和REST API显示在队列中。向每个消费者发送无限数量的消息似乎打败了队列。
如果您的队列是时间敏感的,您还可以在队列中添加TTL,以便在(例如)60分钟后自动解除消息。