跟踪AWS上的异步Lambda执行

时间:2018-10-31 16:39:53

标签: java amazon-web-services architecture aws-lambda amazon-sqs

我正在尝试构建一个调用AWS lambda的流程,然后该流程利用AWS SNS发送触发更多lambda的消息。每个这样触发的lambda都会将输出文件写入S3。该过程如下图所示-

enter image description here

我的问题是-我怎么知道所有的lambda都是写文件完成的?我要执行另一个收集所有这些文件并合并的过程。我可以想到两种明显的方法-

  1. 恒定监视s3的输出文件与SNS消息一样多。一旦总数达到,请调用最终的合并lambda。
  2. 使用数据库作为同步源,为该特定作业/会话写入计数,并一直对其进行监视,直到计数达到SNS消息计数为止。

两种解决方案都需要持续轮询,我想避免这种情况。我想以事件驱动的方式执行此操作。我希望Amazon SQS可以通过某种“空队列lambda触发器”来挽救我,但SQS仅支持对新消息进行lambdas触发。在AWS中,是否有任何已知的方法可以通过事件驱动的方式来实现这一目标?非常感谢您的建议/评论/答案。

4 个答案:

答案 0 :(得分:2)

AWS Step Functions(托管状态机服务)将是显而易见的选择。 AWS有一些示例作为起点。我记得一个可能是循环状态,您可以将其应用于此用例。

另一种想法浮出水面...

创建一个“ Orchestration Lambda”,其中包含您的文件列表...

  1. 业务流程Lambda在循环中调用“文件编写器Lambda”,并传递文件信息。 invokeAsync(InvokeRequest请求)返回一个Future对象。编排Lambda可以检查将来的对象状态是否完成。

  2. 业务流程Lambda可以对“ File Writer Lambda”进行类似的调用,但可以使用更灵活的方法:invokeAsync(InvokeRequest request,AsyncHandler asyncHandler)。您可以创建一个实现此AsyncHandler的内部类,并在Orchestration Lambda中监视那里的完成情况。比所有循环都干净一点。

解决这个问题的方法可能很多,但是有两个想法。

答案 1 :(得分:2)

我会在这里提出几个选择:

步骤功能:

这是状态机的托管服务。这对协调工作流非常有用。

原子计数:

如果您事先知道事情的数量,则可以在DynamoDB中初始化Atomic Counter,然后在工作完成时以原子方式递减。使用DynamoDB流可在计数器发生变化时触发Lambda调用,并在计数器达到零时触发下一个阶段(或工作结束)。请注意,每当应用程序创建,更新或删除表中的项目时,DynamoDB Streams都会写入流记录,因此计数器的每次更改都会触发您的Lambda。

请注意,DynamoDB流保证以下内容:

  • 每个流记录在流中仅显示一次。

  • 对于在DynamoDB表中修改的每个项目,流记录的显示顺序与对该项目的实际修改相同。

答案 2 :(得分:1)

我个人更喜欢“步进功能”。

但是,如果您想简化架构,则可以创建触发的lambda函数。在lambda函数设计器的左侧选择“ S3触发器”并在底部进行配置。 enter image description here

查看更多-Using AWS Lambda with Amazon S3

但是在这种情况下,您必须创建更复杂的lambda函数,这将检查所有合适的文件都已上传到S3上,然后开始合并。

答案 3 :(得分:1)

陈述的问题似乎很适合Saga模式。 基本上,Saga的描述就像任何长时间运行的分布式进程。

如前所述,AWS平台允许使用Step函数来实现Saga as described here enter

相关问题