【发布时间】:2017-10-22 16:36:54
【问题描述】:
我有一个 lambda 函数,它需要很长时间才能完成。它从 DynamoDB 读取记录,并为每条记录执行对第 3 方服务的 HTTP 调用,然后将结果保存回 DynamoDB。我想扩大这个功能,以便它可以处理更多的记录。由于可以超过最大 lambda 持续时间,因此需要重新设计。
解决方案似乎很明显。一个 lambda 从 DynamoDB 读取所有记录,然后向所有记录发出 HTTP 请求,然后将消息发送到 SQS。另一个 lambda 侦听队列并仅对一部分数据执行该工作。两个 lambdas 都很快。
问题:我使用的第 3 方 API 每秒只允许调用 5 个请求。为了满足这个要求,我需要确保使用 SQS 事件的 lambdas 不超过 3rd 方 API 的并发限制。
是否可以限制 AWS Lambda 并行执行?
解决方案
我使用的最终解决方案类似于 programmersmurf 在下面的评论中提出的解决方案。
- 调度程序 Lambda 从 DynamoDB 读取所有记录并将消息发送到 SQS。它将在凌晨 4 点运行
- 工作人员 Lambda 计划在凌晨 5 点工作,并且每天仅触发一次
- worker Lambda 从 SQS 获取大量消息并并行发出 HTTP 请求
- 一旦工作人员 Lambda 完成并且消息数量为正,就会进行递归 Lambda 调用
- 如果收到的消息数为 0,则处理终止
递归工作者 Lambda 调用的好处: - 无需手动调整触发器与消耗的 SQS 消息数量 - 工作 Lambda 的执行之间没有停顿 - 作为最大吞吐量的结果
更新
亚马逊增加了通过设置控制 AWS Lambda 并发级别的能力。
阅读更多:
https://docs.aws.amazon.com/lambda/latest/dg/history.html https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html
【问题讨论】:
-
查看docs.aws.amazon.com/lambda/latest/dg/… 似乎没有设置仅 限制执行的函数的并行副本数。 保留并发还限制了执行的其他函数的数量。因此,如果您将预留并发设置为 100,则意味着即使您的预留功能未执行,您的 1000 个可用并发运行实例中也只有 900 个可以运行。
标签: aws-lambda amazon-sqs