AWS Lambda 更快的处理方式
AWS Lambda faster process way
目前,我正在实施基于 S3、Lambda 和 DynamoDB 的解决方案。
我的用例是,当一个新对象上传到 S3 时,第一个 Lambda 函数被调用,下载新文件,将它分成大约 100(或更多)部分,并为每个部分添加额外的信息。下一步,每个部分将由第二个 Lambda 函数处理,在某些情况下,插入将在 DynamoDB 中执行。
我的问题只是关于调用 "second lambda" 的最佳方式。我的意思是,更快的方法。我想同时执行 100 个 Lambda 函数(如果我要处理 100 个零件)。
我知道有不同的可能性:
1) 我的第一个 Lambda 函数可以将每个部分作为一个项目推送到 Kinesis 流中,而我的第二个 Lambda 函数将做出反应、检索一个项目并对其进行处理。在这种情况下,我不知道 AWS 是否会在每次流中有剩余项时启动新的 Lambda 函数。也许有一些限制...
2) 我的第一个 Lambda 函数可以推送 SNS 主题中的每个部分,然后我的第二个 Lambda 函数将对每条新消息做出反应。在这种情况下,我对延迟(通过 SNS 主题发送消息的操作与执行第二个 Lambda 函数的时间之间的时间)有些怀疑。
3) 我的第一个 Lambda 函数可以通过执行 API 调用并传递信息直接启动第二个函数。在这种情况下,我不知道我是否可以同时启动 100 个 Lambdas 函数。我想我会被 AWS 的速率限制所困API(我说,我想!)
有人对我的用例有反馈或建议吗?还有一次,对我来说最重要的是有更快的处理方式。
谢谢
Lambda 限制已到位以提供一些合理的默认值,但许多工作负载很快就会超过它们。您可以请求增加,这样这就不会成为您的用例的瓶颈。本文档描述了该过程:
http://docs.aws.amazon.com/lambda/latest/dg/limits.html
我不确定您的用例可以容忍多少延迟,但我经常使用 SNS 进行扇出,并且延迟通常是下一次调用的亚秒级(除非是 Java/coldstart)。
如果延迟非常敏感,那么您可能希望使用 Invoke
with the InvocationType
set to "Event" 直接调用 Lambda。当您 Invoke
100 次时,这将最大限度地减少阻塞。如果您想要超级优化,您还可以将这些 Invoke
调用线程化到您的主 Lambda 函数中,以进一步提高并行度。
冷容器偶尔会导致您的调用延迟。如果以毫秒为单位,这可能会变得棘手。试图超优化 Lambda 处理时间的人有时会安排 "heartbeat" 事件立即 returns 执行他们的 Lambda 函数(因此处理时间很便宜)。这些容器将保留 "warm" 一小段时间,这样他们就可以在不花费 "cold startup" 时间的情况下接收您的事件。 Java 容器比 Node 容器慢得多(我假设 Python 可能和 Node 一样快,尽管我没有测试过)。
目前,我正在实施基于 S3、Lambda 和 DynamoDB 的解决方案。 我的用例是,当一个新对象上传到 S3 时,第一个 Lambda 函数被调用,下载新文件,将它分成大约 100(或更多)部分,并为每个部分添加额外的信息。下一步,每个部分将由第二个 Lambda 函数处理,在某些情况下,插入将在 DynamoDB 中执行。
我的问题只是关于调用 "second lambda" 的最佳方式。我的意思是,更快的方法。我想同时执行 100 个 Lambda 函数(如果我要处理 100 个零件)。
我知道有不同的可能性:
1) 我的第一个 Lambda 函数可以将每个部分作为一个项目推送到 Kinesis 流中,而我的第二个 Lambda 函数将做出反应、检索一个项目并对其进行处理。在这种情况下,我不知道 AWS 是否会在每次流中有剩余项时启动新的 Lambda 函数。也许有一些限制...
2) 我的第一个 Lambda 函数可以推送 SNS 主题中的每个部分,然后我的第二个 Lambda 函数将对每条新消息做出反应。在这种情况下,我对延迟(通过 SNS 主题发送消息的操作与执行第二个 Lambda 函数的时间之间的时间)有些怀疑。
3) 我的第一个 Lambda 函数可以通过执行 API 调用并传递信息直接启动第二个函数。在这种情况下,我不知道我是否可以同时启动 100 个 Lambdas 函数。我想我会被 AWS 的速率限制所困API(我说,我想!)
有人对我的用例有反馈或建议吗?还有一次,对我来说最重要的是有更快的处理方式。
谢谢
Lambda 限制已到位以提供一些合理的默认值,但许多工作负载很快就会超过它们。您可以请求增加,这样这就不会成为您的用例的瓶颈。本文档描述了该过程: http://docs.aws.amazon.com/lambda/latest/dg/limits.html
我不确定您的用例可以容忍多少延迟,但我经常使用 SNS 进行扇出,并且延迟通常是下一次调用的亚秒级(除非是 Java/coldstart)。
如果延迟非常敏感,那么您可能希望使用 Invoke
with the InvocationType
set to "Event" 直接调用 Lambda。当您 Invoke
100 次时,这将最大限度地减少阻塞。如果您想要超级优化,您还可以将这些 Invoke
调用线程化到您的主 Lambda 函数中,以进一步提高并行度。
冷容器偶尔会导致您的调用延迟。如果以毫秒为单位,这可能会变得棘手。试图超优化 Lambda 处理时间的人有时会安排 "heartbeat" 事件立即 returns 执行他们的 Lambda 函数(因此处理时间很便宜)。这些容器将保留 "warm" 一小段时间,这样他们就可以在不花费 "cold startup" 时间的情况下接收您的事件。 Java 容器比 Node 容器慢得多(我假设 Python 可能和 Node 一样快,尽管我没有测试过)。