使用提交后排序保证的消息排队

时间:2017-10-26 22:08:06

标签: rabbitmq message-queue mom

我有一个用例,我必须使用排队机制,确保消息(消费者)按顺序处理消息,并且一个接一个地处理消息。

我过去使用过RabbitMQ,它保证了收到消息的顺序。但是,如果该顺序不正确怎么办?

假设我提交消息[4,5,3,2,1],RabbitMQ消费者将按此顺序处理消息。如果我希望按顺序[1,2,3,4,5]处理它们,因为消息相互依赖会怎么样?

此外,我不希望消费者在确认消息2之前消费消息3(无间隙)。

是否有支持此用例的排队解决方案?目前,我们将消息转储到数据库中,并让工作人员按顺序定期提取数据。

1 个答案:

答案 0 :(得分:1)

考虑两种模式中的一种:“消息序列”或“重新定序器”。

Message Sequence非常有用,如下所示:

  

每当需要将大量数据分成消息大小的块时,将数据作为消息序列发送,并使用序列标识字段标记每条消息。

Resequencer有点不同:

  

使用有状态过滤器(Resequencer)来收集和重新排序消息,以便可以按指定顺序将消息发布到输出通道。

     

Resequencer可以接收可能无法按顺序到达的消息流。 Resequencer包含内部缓冲区,用于存储失序消息,直到获得完整序列。然后将顺序消息发布到输出通道。重要的是输出通道是保持顺序的,因此保证消息按顺序到达下一个组件。与大多数其他路由器一样,Resequencer通常不会修改消息内容。

高度建议阅读Gregor Hohpe / Bobby Woolf撰写的“企业整合模式”一书中的这些模式(由Martin Fowler等人的贡献)

这里有更多详细信息,但基本上消息序列依赖于序列标识符,位置和“结束”(布尔字段)。您需要队列末尾的适配器来处理序列。

另一方面,

序列发生器“将无序消息存储在内部缓冲区中,直到获得完整序列,然后以正确的顺序将消息发布到输出通道”(第285页)。

这非常类似于您正在使用的“转储到数据库,然后有工人拉动”策略。

这些模式的实现细节将基于您的应用程序语言和队列选择(在您的情况下为RabbitMQ),但模式已经非常完善,所以我会好好看看那些。

我不知道RabbitMQ中的任何内置机制可以帮助你获得这个。

希望这有帮助。

修改

我用Google搜索“RabbitMQ resequencer”并发现以下内容(虽然不能保证效果):rabbus-sequence (GitHub)

无论如何,可能有助于查看他们的代码在那里做的任何事情,看看是否可以从中获得灵感。