我创建了一些连接到Rabbitmq中的队列的消费者,每次都需要10,50,100个消息,以避免不必要的连接。 有时我们遇到队列几乎为空的情况,只有一个消费者获得了所有消息。不幸的是,其中一条消息可能处理缓慢(例如第三方Web服务超时),而其他所有消息都必须排队等待,即使它们更快。 虽然如此,其他消费者都是空的,无所事事,但是他们无法接收第一个尚未处理的消息。
如果我可以向Rabbitmq发送一些消息给消费者,如果它在一段时间后没有确认,那么按摩必须被送到队列并被另一个消费者带走。 有人知道是否有解决方法?
答案 0 :(得分:0)
请考虑以下情形:
- 队列中有数千条消息
- 单个消费者使用AutoAck = true订阅队列,并且没有预取计数设置
将会发生什么?
RabbitMQ的实现是提供任意数量的 消息给未预取计数的客户端。此外,与 自动确认,预取计数无关紧要,因为消息是 在交付给消费者时得到承认。
因此,该点的队列中的每条消息都将被传递给 消费者将立即被消费者所淹没 消息。假设每条消息都很小,但需要5分钟 过程中,这一个消费者完全有可能 在任何其他消费者可以附加之前排空整个队列。 自从AutoAck打开后,经纪人就会忘记这些 发送后立即发送消息。
显然,如果您想获得这些,这不是一个好的方案 消息被处理,因为他们已经离开了相对的安全 经纪人现在坐在消费端点的RAM中。我们先说吧 遇到崩溃消耗端点的异常 - 噗,所有的消息都消失了。
我相信您所看到的是AutoAck
设置为true的情况。当发生这种情况时,如果没有其他消费者在有机会之前连接,第一个连接的消费者将耗尽整个队列。尝试将AutoAck
设置为false,然后选择合理的预取计数(0-1可能?)并且您不会继续看到此行为。
答案 1 :(得分:0)
Autoack是假的,但我有一个很高的预取,就像50条消息一样,因为我想减少对Rabbit的调用。 目前我将预取更改为5,因此当消息冻结时,消费者将只保留5条消息。我正在监控Rabbit服务器的性能,但我担心在高峰期消耗。 谢谢你的帮助。