具有无服务器功能(例如AWS Lambda)/ Python的“ Fork and Join”

时间:2019-03-18 18:22:26

标签: python amazon-web-services aws-lambda

我正在使用AWS Lambda(https://registry.opendata.aws/sentinel-2/)处理相对较大的图像。

为了处理这些图像,我将它们分成较小的图像(约1500个“芯片”),这些图像可以独立处理(芯片的数量根据源图像的内容而变化不定)。使用Lambda的多次调用并行处理芯片,该Lambda占用数百个芯片的“页面”。

这就是我要坚持的地方:处理完所有页面后,我需要将结果合并到一个输出图像中,但是如何知道所有页面(“可变批调用”)何时完成?

我考虑过将进度信息写入s3或dynamo,并在每页之后调用合并功能,以便仅继续执行该功能的最后一次调用(当进度检查返回完成时)。我看到过诸如期货/承诺之类的选项,但是一页筹码的处理时间约为10-15分钟,所以我不想保留“控制器”功能来等待期货/承诺的完成,因为在那个时候进行多次调用会更便宜。

是否有更好的解决方案,可以写出进度信息并多次检查?

(注意,我已经看到了这个问题:Fork and Join with Amazon Lambda

1 个答案:

答案 0 :(得分:1)

您可以使用Amazon SQS将筹码添加到队列中,并让worker或Lambdas将这些单独的任务从队列中拉出。然后,您可以使用cloudwatch警报设置来监视队列的深度,其中队列深度为零(作业完成)将触发“完成” Lambda,该Lambda将各个输出芯片重新组合在一起。

我相信CloudWatch会每隔5分钟提醒一次轮询队列状态,因此对于您的处理时间较长(〜1​​0-15分钟)的用例来说,这并不是瓶颈(Lambda超时为15分钟) ,因此,如果您设置为在15分钟后进行轮询,则您的Lambda要么失败,要么在那之前完成)。

逐步操作,看起来像什么:

  1. 将新文件上传到S3
  2. 上传触发lambda将文件分解为新文件夹中的“碎片”
  3. 将所有筹码添加到新队列
  4. Lambdas将筹码从队列中拉出
  5. 当队列为空时,触发聚集lambda

这是根据队列状态设置触发器的另一个有用的答案:Efficient way to check whether SQS queue is empty

相关问题