我正在尝试构建一个调用 AWS lambda 的流程,然后该流程利用 AWS SNS 发送触发更多 lambda 的消息。每个这样触发的 lambda 将输出文件写入 S3。流程如下图-
我的问题是 - 我怎么知道所有的 lambda 都完成了写入文件?我想执行另一个收集所有这些文件并进行合并的进程。我可以想到两种明显的方法 -
- 持续监控 s3 以获取与 SNS 消息一样多的输出文件。一旦达到总计数,调用最终的合并 lambda。
- 使用数据库作为同步源,为该特定作业/ session 写入计数并持续监控它直到计数达到 SNS 消息计数。
这两种解决方案都需要不断轮询,我想避免这种情况。我想以事件驱动的方式执行此操作。我希望 Amazon SQS 能通过某种“空队列 lambda 触发器”来拯救我,但 SQS 只支持在新消息上触发 lambda。有什么已知的方法可以在 AWS 中以事件驱动的方式实现这一点吗?非常感谢您的建议/意见/答案。
最佳答案
我会在这里提出几个选项:
阶跃函数:
这是状态机的托管服务。它非常适合协调工作流程。
原子计数:
如果你事先知道事物的数量,你可以初始化一个 Atomic Counter在 DynamoDB 中,然后在工作完成时自动递减它。使用 DynamoDB Streams 在计数器发生变化时触发 Lambda 调用,并在计数器归零时触发下一阶段(或工作结束)。请注意,每当应用程序创建、更新或删除表中的项目时,DynamoDB Streams 都会写入一条流记录,因此计数器的每次突变都会触发您的 Lambda。
请注意,DynamoDB Streams 保证以下内容:
每个流记录在流中只出现一次。
对于 DynamoDB 表中修改的每个项目,流记录的显示顺序与项目的实际修改顺序相同。
关于java - 跟踪 AWS 上的异步 Lambda 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53088269/