在RabbitMQ中确认消费者的剩余消息

时间:2018-04-17 12:59:41

标签: python-3.x rabbitmq

我有一个队列,3个消费者绑定到队列。每个消费者的prefetch_count为250(或者说X),并且手动确认是prefetch_count(X)/ 2(即125)消息 - 意味着消费者一次性手动确认125条消息(这有助于减少往返时间,因此提高性能)。一切都按预期正常工作,但唯一的问题是当队列中没有新消息而消费者有一些未确认的消息,其数量少于125时。

由于确认仅在计数为125时发送,因此这些未确认的消息将保持重新排队。我该如何解决这个问题?

我怎么知道我的消费者没有要处理的新消息,并且可以确认等待被确认的所有剩余消息。

1 个答案:

答案 0 :(得分:1)

如果我理解你的情况正确,听起来好像你有一系列的消息一次全部发布,然后你一次批量处理它们,直到你没有留下。问题是,如果您没有可被125整除的许多消息,那么您的最终批次永远不会得到确认。显然这是一个逻辑问题,但听起来你想知道是否有一种简单的方法来处理它。

您的问题“我怎么知道我的消费者没有要处理的新消息?”基于RabbitMQ不支持的前提 - 即一系列消息的“结束”。 RabbitMQ消费者希望继续无限期地接收消息,因此从他们的角度来看,没有“完成”这样的事情。

因此,任何此类概念都必须在其他地方实现,在应用程序逻辑中更高。以下是一些供您考虑的选项:

  1. 如果您事先知道将处理多少邮件,请先发送该邮件并存储。处理完该号码后发送最终确认(假设没有处理重复项)。
  2. 在消费者处监视内存中的集合(所有预先获取的消息都驻留在此处,直到实际处理它们为止)。当它低于125时,您知道批量小于此值。
  3. 与#1类似,发送一条消费者可以收到的特殊“最后消息”,并在收到消息时知道确认。
  4. 警告:我认为你有一些更深层次的设计问题正在导致首先要做到这一点的道路。每封邮件应100%独立于任何其他邮件。如果违反了这个假设,那么你将拥有一个非常脆弱的系统。