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