2017-01-03 51 views
1

目前,我正在实施一个基于S3,Lambda和DynamoDB的解决方案。 我的用例是,当一个新对象上传到S3上时,第一个Lambda函数被调用,下载新文件,将其分割成大约100(或更多)个部分,并为每个部分添加额外的信息。下一步,每个部分都将被第二个Lambda函数处理,在某些情况下,将在DynamoDB中执行插入。AWS Lambda更快的处理方式

我的问题只是关于调用“第二lambda”的最佳方式。我的意思是,更快的方式。我想要同时执行100个Lambda函数(如果我要处理100个零件)。

我知道有不同的可能性:

1)我的第一拉姆达功能可以推动每一部分如在室壁运动流和项目我的第二拉姆达功能会发生反应,检索项目和处理它。在这种情况下,我不知道AWS每次在流中有剩余项目时是否会启动新的Lambda函数。也许有一些限制...

2)我的第一个Lambda函数可以推动SNS主题中的每个部分,然后我的第二个Lambda会对每条新消息作出反应。在这种情况下,我对延迟(通过SNS主题发送消息的操作与执行第二个Lambda函数的时间之间的时间间隔)有一些怀疑。

3)我的第一个Lambda函数可以通过执行API调用并传递信息直接启动第二个函数。在这种情况下,我不知道我是否可以同时启动100个Lambda功能。我认为我会受到针对AWS API的费率限制(我说,我想!)

有人对我的使用案例有反馈,也许建议?再一次,对我来说最重要的是拥有更快的处理方式。

感谢

+0

...或者您可以使用与第一个Lambda相同的方法。将你的作品放入另一个S3存储桶中,在对象元数据中保存附加信息并将第二个Lambda附加到第二个存储桶中。 –

+0

这是另一种解决方案,但我不确定这是更快的方法.... – Matt

回答

4

LAMBDA限制到位,以提供一些明智的默认设置,但是很多工作量很快超过他们。你可以要求增加,所以这不会成为你的用例的瓶颈。本文档描述的过程如下: http://docs.aws.amazon.com/lambda/latest/dg/limits.html

我不确定您的用例可以承受多少延迟,但我经常使用SNS扇出,并且延迟通常是次秒以下的调用(除非是Java /冷启动)。

如果延迟非常敏感,那么您可能需要直接使用Invoke with the InvocationType set to "Event"来调用Lambda。这会最大限度地减少阻止,而你Invoke 100次。如果您想要进行超级优化,您还可以在主Lambda函数内调用这些Invoke调用以进一步提高并行度。

冷容器偶尔会导致调用的延迟。如果毫秒数,这可能变得棘手。试图超级优化Lambda处理时间的人有时会安排他们的Lambda函数执行,并且会立即返回(因此处理时间便宜)的“心跳”事件。这些容器会在很短的时间内保持“温暖”,这使得他们可以在不产生“冷启动”时间的情况下提取事件。 Java容器的启动速度要比Node容器慢得多(我假设Python虽然没有经过测试,但可能与Node相同)。

+1

感谢您的回答戴夫,最后我直接从我的第一个启动我的lambda。它完美的作品。谢谢 – Matt