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

时间:2015-02-25 10:23:09

标签: message-queue amazon-sqs

我有一个队列接收" event"导致重新计算一个或多个共享资源的消息。这些消息的排序在特定资源中很重要,并且队列在任何时候都可以包含同一资源的多条消息。

我想以这样的方式设计系统,以便将来可以添加多个消费者(即扇出),而不必担心消息被无序处理(对于他们的特定资源而言)属于)

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

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

1 个答案:

答案 0 :(得分:0)

您的事件将需要某种资源的序列号,允许消费者确定他们何时收到无序消息。对此的一个很好的参考是Message Sequence模式。

您将需要一些由扩展的消费者共享的存储(例如,数据库),其中最后处理的消息的序列号保留在那里,以便每个消费者具有对上次处理的消息的一致视图。 (您可能已经为消费者提供了一些共享存储,用于重复数据删除和域数据。)

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

  • 实施Resequencer。这听起来像是"批量处理每个资源的未完成消息"你在问题中提到的想法。此模式的缺点是您可能需要格外小心以确保重定序器以持久的方式存储消息。这可能比它的价值更麻烦。
  • 我认为存在一个更简单的解决方案:如果消费者确定它已收到无序消息,则它根本不处理该消息,并且不会将其从队列中删除。在SQS可见性超时到期之前,消费者不会再次接收该消息。在此期间,可以接收和处理序列中的其他消息。一旦可见性超时到期,旧消息将再次可用于处理,此时它可能是序列中的下一条消息。如果没有,它将被简单地留在队列中,直到处理序列中的下一条消息。