首页 文章

如何重新传递RabbitMQ已经发送给消费者的消息

提问于
浏览
0

我创建了一些连接到Rabbitmq中的队列的消费者,每次都需要10,50,100个消息,以避免不必要的连接 . 有时我们遇到队列几乎为空的情况,只有一个消费者获得了所有消息 . 不幸的是,其中一条消息可能处理缓慢(例如第三方Web服务超时),而其他所有消息都必须排队等待,即使它们更快 . 虽然这样,其他消费者都是空的,无所事事,但他们无法接收第一个仍未处理的消息 .

如果我可以向Rabbitmq发送一些消息给消费者,如果它在一段时间后没有确认,那么按摩必须被送到队列并被另一个消费者带走 . 有人知道是否有解决方法?

2 回答

  • 0

    看看我的answer to this question .

    请考虑以下情形:队列中包含数千条消息单个消费者使用AutoAck = true订阅队列,并且没有预取计数集将会发生什么? RabbitMQ的实现是向没有预取计数的客户端提供任意数量的消息 . 此外,使用Auto-Ack,预取计数无关紧要,因为消息在传递给消费者时得到确认 . 因此,该点处队列中的每个消息将立即传递给消费者,消费者将被消息淹没 . 假设每条消息都很小,但需要5分钟来处理,那么这个消费者完全有可能在任何其他消费者可以附加消息之前耗尽整个队列 . 并且由于AutoAck已打开,代理会在交付后立即忘记这些消息 . 显然,如果您希望处理这些消息,这不是一个好的方案,因为它们已经离开了代理的相对安全性,现在位于消费 endpoints 的RAM中 . 假设遇到一个异常,它会消耗消耗 endpoints - 噗,所有消息都消失了 .

    我相信你所看到的是你将 AutoAck 设置为true的情况 . 当发生这种情况时,如果没有其他消费者在有机会之前连接,第一个连接的消费者将耗尽整个队列 . 尝试将 AutoAck 设置为false,然后选择合理的预取计数(0-1可能?),您将不会看到此行为继续 .

  • 0

    Autoack是假的,但我有一个很高的预取,就像50条消息一样,因为我想减少对Rabbit的调用 . 目前我将预取更改为5,因此当消息冻结时,消费者将只保留5条消息 . 我正在监控Rabbit服务器的性能,但我担心在高峰期消耗 . 谢谢你们的帮助 .

相关问题