【问题标题】:RabbitMQ: next message can be dequeued only after previous was ackedRabbitMQ:下一条消息只有在上一条消息被确认后才能出队
【发布时间】:2015-12-02 21:39:28
【问题描述】:

我想在 RabbitMQ 中的队列上有这个约束:

队列中的下一条消息在前一条消息(正在处理的消息)被确认之前不能出队。

通过这个,我将实现事件的有序处理和跨多个队列的并行处理。我如何/可以为此配置 RabbitMQ?

编辑(澄清):将有许多消费者都试图从所有队列中获取工作,并且由于他们无法从正在处理的事件未确认的队列中获取工作 - 保持有序处理。

【问题讨论】:

    标签: rabbitmq mq


    【解决方案1】:

    在前一条消息(正在处理的消息)被确认之前,队列中的下一条消息不能出队。

    您可以通过consumer prefetch limit 为单个消费者执行此操作。

    通过这个我将实现事件的有序处理和跨多个队列的并行处理。

    很遗憾,这不会产生您想要的效果。

    您可以为个人消费者设置。该消费者将等待一条消息得到确认,然后再获取下一条消息。

    但是,这适用于个人消费者,而不是队列。

    如果您有 2 个消费者,他们每个人都会并行处理一条消息。如果您有 10 个消费者,则将并行处理 10 条消息。

    按顺序处理每条消息的唯一方法是拥有一个预取为 1 的消费者。

    【讨论】:

    • 我会补充一点,在某些情况下,将队列声明为exclusive 可能会完成这项工作。在这种情况下,队列可以限制为创建它的连接,因此可以轻松控制消费者数量。除此之外,Dead Lettering 和 Alternate Exchanges 还可用于将错过的消息捕捉到某个地方。
    • 感谢您的回答。我已经对这个问题进行了澄清。将有许多工人都试图从所有队列中出列。这是为了实现并行性和可用性。所以对消费者有约束是不够的,它需要在队列中。
    • 答案保持不变。它不能与多个消费者一起完成。即使您有一个独占队列,在该连接中拥有多个消费者仍然是多个消费者。您将进行并行处理,或者您将进行订购处理。这不是rabbitmq的限制,而是一般的分布式系统/消息传递。没有系统支持这一点,因为这是不可能的。
    • 网络上还有其他一些关于此的 SO 问题和文章:stackoverflow.com/questions/21363302/…camel.apache.org/parallel-processing-and-ordering.html 作为示例 - 正如第二篇文章所建议的那样,您可以使用类似重测序器的东西。 . 但这会阻止并行处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多