Message queue 更新相同资源的多个队列使用者

Message queue 更新相同资源的多个队列使用者,message-queue,amazon-sqs,Message Queue,Amazon Sqs,我有一个队列,它接收导致重新计算一个或多个共享资源的“事件”消息。这些消息的顺序在特定资源中很重要,队列可以在任何时候包含同一资源的多条消息 我希望在设计系统时,将来可以添加多个使用者(即扇出),而不必担心消息被无序处理(同样针对它们所属的特定资源) 我可以想出几种方法来解决这个问题,包括资源锁和批量处理每个资源的未完成消息,但我的问题是:是否有一个现有的模式或白皮书来描述这个问题的解决方案 问题是技术不可知,但我将使用SQS。您的事件将需要某种类型的每个资源的序列号,以允许消费者确定何时收到顺

我有一个队列,它接收导致重新计算一个或多个共享资源的“事件”消息。这些消息的顺序在特定资源中很重要,队列可以在任何时候包含同一资源的多条消息

我希望在设计系统时,将来可以添加多个使用者(即扇出),而不必担心消息被无序处理(同样针对它们所属的特定资源)

我可以想出几种方法来解决这个问题,包括资源锁和批量处理每个资源的未完成消息,但我的问题是:是否有一个现有的模式或白皮书来描述这个问题的解决方案


问题是技术不可知,但我将使用SQS。

您的事件将需要某种类型的每个资源的序列号,以允许消费者确定何时收到顺序错误的消息。这方面的一个很好的参考是模式

您将需要一些存储(例如,数据库),这些存储由扩展的使用者共享,最后处理的消息的序列号保留在那里,以便每个使用者都能一致地查看最后处理的消息是什么。(您可能已经为您的消费者提供了一些共享存储,用于邮件重复数据消除和域数据。)

有了这些,您就有了几个选择:

  • 实施一项计划。这听起来像是您在问题中提到的“每个资源批量处理未完成的消息”的想法。这种模式的一个缺点是,您可能需要格外小心,以确保重新排序器以持久的方式存储消息。这可能比它的价值更麻烦
  • 我认为存在一个简单得多的解决方案:如果消费者确定它收到的消息顺序不正确,它就不会处理该消息,也不会将其从队列中删除。在SQS可见性超时过期之前,消费者不会再次收到该消息。在此期间,可以接收和处理序列中的其他消息。一旦可见性超时过期,旧消息将再次可供处理,此时它可能是序列中的下一条消息。如果没有,它将留在队列中,直到处理序列中的下一条消息
消费者是否有办法确定信息是否按顺序发送?例如,事件消息是否包含生产者设置的顺序标识符?@AdrianHofman-否消息来自不同的使用者。好的,使用者如何确定其收到的消息顺序错误?