代码之家  ›  专栏  ›  技术社区  ›  Danish

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

  •  1
  • Danish  · 技术社区  · 6 年前

    我有一个队列,3个消费者绑定到该队列。每个消费者的预回迁计数为250(或者说X),手动确认完成预回迁计数(X)/2(即125)条消息-这意味着消费者在一次围棋中手动确认125条消息(这有助于减少往返时间,从而提高性能)。一切正常,但唯一的问题是队列中没有新消息,并且消费者有一些计数小于125的未确认消息。

    由于只有在计数为125时才发送确认,因此这些未确认的消息会不断重新排队。我如何解决这个问题?

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   theMayer    6 年前

    如果我正确理解了您的场景,听起来好像您有一系列消息一次全部发布,然后您一次处理250条消息,直到一条消息都没有了。问题是,如果您没有可被125整除的消息数,那么您的最后一批消息永远不会得到确认。显然,这是一个合乎逻辑的问题,但听起来你想知道是否有一种简单的方法来处理它。

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

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

    1. 如果您提前知道将处理多少条消息,那么首先发送该计数并存储。处理完该号码后发送最终ack(假设未处理重复的号码)。
    2. 与#1类似,发送一条特殊的“最后一条消息”,消费者可以接收到该消息,并知道在收到后要确认。

    注意事项: 我想说的是,你有一些更深层次的设计问题,这将引导你走上一条希望首先做到这一点的道路。每条消息都应该完全独立于任何其他消息。如果违反了这一假设,你将有一个非常脆弱的系统。