如何在SQS队列中完成批处理后通知?

时间:2015-07-26 07:15:09

标签: message-queue distributed amazon-sqs

我在SQS队列和一些工作人员中有一批n条消息。这些工作程序从队列中获取消息,处理它们,然后在成功时删除它们。一旦所有工作人员完成了这批n条消息,我想执行其他操作。唯一的问题是弄清楚批次何时完成。

执行此操作的一种方法是检查队列是否为空。当我看一下SQS API时,唯一看起来很接近的是从ApproximateNumberOfMessages获得的GetQueueAttributes属性。但是,"近似"表明它并不是出于我的想法,而且其目的更多的是根据队列中大约有多少消息来扩大和缩小工作人员数量。

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

2 个答案:

答案 0 :(得分:1)

SQS并没有真正的内置机制来分组消息。此外,SQS不保证特定邮件不会被多次处理 [1] ,因此您无法简单地计算处理的邮件数量

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

例如:

  1. 当您将组中的每封邮件排入原始队列时,请将message ID记录在外部数据库中,并附上您自己发明的组号。
  2. 工作人员处理消息后,工作人员应从数据库中获取该消息的组号(或者只在原始消息中包含组号作为attribute),并从中删除消息ID数据库(如果它还没有被另一个工作者删除,如果两个工作者从队列中获得相同的消息,则可能发生这种情况)。然后,工作人员应将包含组号的新消息排入第二个队列。
  3. 另一名工作人员从第二个队列中读取包含组号的消息,并检查数据库以查看该组号的任何原始消息是否仍然存在。如果有的话,这个工人什么都不做。如果该组没有其他消息,则此工作人员将执行您的其他操作。请注意,由于SQS'分布式性质,此最终消息也可以多次处理,因此附加操作应该是幂等的(或者至少以某种方式检查它是否已经执行过)。
  4. 通过此设置,您可以同时在系统中运行多个不相关的批次。

答案 1 :(得分:0)

您可以考虑向您的工作进程添加一些代码,当它要求处理消息并且什么都不返回时,它会启动某种类型的计时器;如果你的工作人员要求消息,处理消息然后删除消息,正如你所说'批处理'只是一个同时收到的消息集合,那么大概是5分钟(或其他一些用户定义的时期)过去并且在重复请求后不会返回任何新消息,您可以启动“批量处理”过程。如果您可以在到达队列末尾时将工作进程缩小到一个(这样您就可以确定其他节点仍未处理),这将更准确。

这绝不是完美的 - 并且将取决于您的消息的流程/时间以及定义属于“批处理”的内容的重要性以及什么不是。

或者,如果在前端您知道批量邮件的准确数量,您可以倒计算已处理邮件的数量,并在您降到零时知道自己已关闭。