我正在使用 AWS Lambda ( https://registry.opendata.aws/sentinel-2/ ) 处理相对较大的图像。
为了处理这些图像,我将它们分割成更小的图像(约 1500 个“芯片”),这些图像可以独立处理(芯片的数量根据源图像的内容而变化)。使用 Lambda 的多次调用并行处理芯片,该 Lambda 接受数百个芯片的“页面”。
这就是我陷入困境的地方:处理完所有页面后,我需要将结果合并到单个输出图像中,但如何知道所有页面(“可变批处理调用”)何时完成?
我考虑过例如将进度信息写入 s3 或 dynamo,并在每个页面之后调用组合函数,以便只有该函数的最后一次调用才会继续(当进度检查返回完成时)。我见过像 futures/promise 这样的选项,但是一页芯片的处理时间约为 10-15 分钟,所以我不想保留一个“ Controller ”功能来等待 futures/promise 完成,因为此时多次调用会更便宜。
有没有更好的解决方案,写出进度信息并多次检查?
(注意我见过这个问题:Fork and Join with Amazon Lambda)
最佳答案
您可以使用 Amazon SQS 将芯片添加到队列中,并让工作人员或 Lambda 将这些单独的作业从队列中拉出。然后,您可以设置一个 cloudwatch 警报来监视队列的深度,其中队列深度为零(作业已完成)会触发“完成”Lambda,它将各个输出芯片重新组合在一起。
我相信 CloudWatch 会以 5 分钟的间隔发出轮询队列状态警报,因此对于处理时间较长(约 10-15 分钟)的用例,它不会成为此处的瓶颈(Lambda 超时无论如何都是 15 分钟) ,因此,如果您设置在 15 分钟进行轮询,那么您的 Lambda 要么已失败,要么将在那时完成)。
一步一步来,这会是什么样子:
- 将新文件上传到 S3
- 上传会触发 lambda 将文件分解为新文件夹中的“碎片”
- 将所有筹码添加到新队列
- Lambda 将筹码从队列中拉出
- 当队列为空时,触发聚合lambda
这是关于根据队列状态设置触发器的另一个有用答案:Efficient way to check whether SQS queue is empty
关于python - "Fork and Join"具有无服务器函数(例如 AWS Lambda)/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55227785/