【发布时间】:2015-12-02 21:39:28
【问题描述】:
我想在 RabbitMQ 中的队列上有这个约束:
队列中的下一条消息在前一条消息(正在处理的消息)被确认之前不能出队。
通过这个,我将实现事件的有序处理和跨多个队列的并行处理。我如何/可以为此配置 RabbitMQ?
编辑(澄清):将有许多消费者都试图从所有队列中获取工作,并且由于他们无法从正在处理的事件未确认的队列中获取工作 - 保持有序处理。
【问题讨论】:
我想在 RabbitMQ 中的队列上有这个约束:
队列中的下一条消息在前一条消息(正在处理的消息)被确认之前不能出队。
通过这个,我将实现事件的有序处理和跨多个队列的并行处理。我如何/可以为此配置 RabbitMQ?
编辑(澄清):将有许多消费者都试图从所有队列中获取工作,并且由于他们无法从正在处理的事件未确认的队列中获取工作 - 保持有序处理。
【问题讨论】:
在前一条消息(正在处理的消息)被确认之前,队列中的下一条消息不能出队。
您可以通过consumer prefetch limit 为单个消费者执行此操作。
通过这个我将实现事件的有序处理和跨多个队列的并行处理。
很遗憾,这不会产生您想要的效果。
您可以为个人消费者设置。该消费者将等待一条消息得到确认,然后再获取下一条消息。
但是,这适用于个人消费者,而不是队列。
如果您有 2 个消费者,他们每个人都会并行处理一条消息。如果您有 10 个消费者,则将并行处理 10 条消息。
按顺序处理每条消息的唯一方法是拥有一个预取为 1 的消费者。
【讨论】:
exclusive 可能会完成这项工作。在这种情况下,队列可以限制为创建它的连接,因此可以轻松控制消费者数量。除此之外,Dead Lettering 和 Alternate Exchanges 还可用于将错过的消息捕捉到某个地方。