多个队列使用者正在更新相同的资源



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

我想以这样一种方式设计系统,即在未来可以添加多个消费者(即扇出),而不必担心消息被无序处理(同样是针对它们所属的特定资源)

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

这个问题与技术无关,但我将使用SQS。

您的事件将需要每个资源的某种序列号,以便消费者在收到无序消息时确定。一个很好的参考是消息序列模式。

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

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

  • 实现重新排序器。这听起来像是您在问题中提到的"按资源批量处理未处理消息"的想法。这种模式的一个缺点是,您可能需要格外小心,以确保重新排序器以持久的方式存储消息。这可能会带来更多的麻烦
  • 我相信存在一个简单得多的解决方案:如果消费者确定它收到了一条无序的消息,它就不会处理该消息,也不会将其从队列中删除。在SQS可见性超时到期之前,使用者不会再次接收到该消息。在此期间,可以接收和处理序列中的其他消息。一旦可见性超时到期,旧消息将可以再次进行处理,此时它可能是序列中的下一条消息。如果没有,它只会留在队列中,直到序列中的下一条消息得到处理

最新更新