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

时间:2018-04-05 13:53:13

标签: rabbitmq queue timeout consumer subscriber

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

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

2 个答案:

答案 0 :(得分:0)

查看我的answer to this question

  

请考虑以下情形:

     
      
  • 队列中有数千条消息
  •   
  • 单个消费者使用AutoAck = true订阅队列,并且没有预取计数设置
  •   
     

将会发生什么?

     

RabbitMQ的实现是提供任意数量的   消息给未预取计数的客户端。此外,与   自动确认,预取计数无关紧要,因为消息是   在交付给消费者时得到承认。

     

因此,该点的队列中的每条消息都将被传递给   消费者将立即被消费者所淹没   消息。假设每条消息都很小,但需要5分钟   过程中,这一个消费者完全有可能   在任何其他消费者可以附加之前排空整个队列。   自从AutoAck打开后,经纪人就会忘记这些   发送后立即发送消息。

     

显然,如果您想获得这些,这不是一个好的方案   消息被处理,因为他们已经离开了相对的安全   经纪人现在坐在消费端点的RAM中。我们先说吧   遇到崩溃消耗端点的异常 -   噗,所有的消息都消失了。

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

答案 1 :(得分:0)

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