我正在使用AWS Lambda (https://registry.opendata.aws/sentinel-2/)处理相对较大的图像。
为了处理这些图像,我将它们分割成更小的图像(~1500个“芯片”),这些图像可以独立处理(芯片的数量根据源图像的内容而发生不可预测的变化)。芯片是使用Lambda的多个调用并行处理的,该Lambda接收数百个芯片的“页面”。
这就是我被困住的地方:当所有页面都被处理完后,我需要将结果组合到一个输出图像中,但是如何知道所有页面--“可变批量调用”--何时完成呢?
我曾考虑过,例如,将进度信息写入s3或dynamo,并在每个页面之后调用组合函数,以便只进行该函数的最后一次调用(当进度检查完成时)。我见过像期货/承诺这样的选项,但一页芯片的处理时间大约是10-15分钟,所以我不想让“控制器”函数等待期货/承诺的完成,因为在这一点上,使用多个调用会更便宜。
有没有更好的解决方案,写出进度信息并多次检查?
(注意:我看过这个问题:Fork and Join with Amazon Lambda)
发布于 2019-03-19 02:42:34
您可以使用Amazon SQS将芯片添加到队列中,并让worker或Lambdas将这些单独的作业从队列中拉出。然后,您可以设置一个cloudwatch警报来监视队列的深度,其中队列深度为零(作业完成)会触发一个“完成”Lambda,该Lambda将把各个输出芯片重新组合在一起。
我相信CloudWatch警报会以5分钟为间隔轮询队列状态,所以对于处理时间较长(大约10- 15分钟)的用例来说,这不会是瓶颈(Lambda超时是15分钟,所以如果您设置为15分钟轮询,那么您的Lambda要么失败了,要么到那时就会完成)。
一步一步,这将是什么样子的:
下面是关于基于队列状态设置触发器的另一个有用的答案:Efficient way to check whether SQS queue is empty
https://stackoverflow.com/questions/55227785
复制相似问题