SQS 队列中的批次完成后如何通知?

Kie*_*ran 5 distributed message-queue amazon-sqs

我在 SQS 队列中有一批n消息和一些工作人员。这些工作人员从队列中获取消息,对其进行处理,如果成功则将其删除。当所有工人完成这批工作后n消息后,我想执行一项附加操作。唯一的问题是确定批次何时完成。

一种方法是检查队列是否为空。当我查看 SQS API 时,唯一看起来接近的是ApproximateNumberOfMessages您从GetQueueAttributes. 然而,“大约”这个词表明它实际上并不是我想要的,它的目的更多的是根据队列中大约有多少消息来增加和减少工作人员的数量。

实现我想要的目标的标准方法是什么?或者 SQS 不适合这个目的?

mat*_*tts 4

SQS 实际上没有任何内置的消息分组机制。此外,SQS 不保证特定消息不会被处理多次[1],因此您不能简单地计算处理的消息数。

相反,您可能需要在外部数据存储中单独跟踪每条消息,然后在处理每条消息后,检查是否有任何剩余消息。

例如:

  1. 当您将组中的每条消息放入原始队列时,请在外部数据库中记录消息 ID以及您自己发明的组号。
  2. 工作人员处理消息后,工作人员应从数据库获取该消息的组号(或者仅将组号作为属性包含原始消息中),并从数据库中删除该消息 ID(如果不是)已被另一个工作人员删除,如果两个工作人员从队列中获取相同的消息,则可能会发生这种情况)。然后,工作人员应将包含组号的新消息放入第二个队列中。
  3. 另一个工作人员从第二个队列中读取包含组号的消息,并检查数据库以查看是否保留了该组号的任何原始消息。如果有的话,这个工人什么也不做。如果该组没有更多消息,则该工作人员将执行您的附加操作。请注意,由于 SQS 的分布式特性,该最终消息也可能被多次处理,因此附加操作应该是幂等的(或者至少以某种方式检查它是否已被执行)。

通过此设置,您将能够通过系统同时运行多个不相关的批次。