减少 lambda 函数并行执行的限制?
Decrease limit of parallel executions of lambda function?
我有一个 lambda 函数需要很长时间才能完成。它从 DynamoDB 读取记录,并针对每条记录执行对第 3 方服务的 HTTP 调用,然后将结果保存回 DynamoDB。我想扩大这个功能,以便它可以处理更多的记录。由于最大 lambda 持续时间可能会超过,因此需要重新设计。
解决方案似乎很明显。一个 lambda 从 DynamoDB 读取所有记录,而不是对所有记录发出 HTTP 请求,然后将消息发送到 SQS。另一个 lambda 侦听队列并仅对一部分数据执行此操作。两个 lambda 都很快。
问题: 第 3 方 API 我正在使用允许每秒仅调用 5 个请求。为了满足这个要求,我需要确保消耗 SQS 事件的 lambda 不超过第 3 方的并发限制 API。
是否可以限制 AWS Lambda 并行执行?
解决方案
我使用的最终解决方案类似于 programmersmurf 在下面的评论中提出的解决方案。
- 调度程序 Lambda 从 DynamoDB 读取所有记录并将消息发送到 SQS。它设置为 运行 凌晨 4 点
- worker Lambda 计划在凌晨 5 点工作,每天只触发一次
- worker Lambda 从 SQS 获取大量消息并并行发出 HTTP 请求
- 一旦 worker Lambda 完成并且消息数量为正,就会进行递归 Lambda 调用
- 如果收到的消息数量为 0,则处理终止
递归工作者 Lambda 调用的好处:
- 无需手动调整触发器与消耗的 SQS 消息量
- 工人 Lambda 的执行之间没有停顿
- 作为最大吞吐量的结果
更新
Amazon 添加了通过设置控制 AWS Lambda 并发级别的功能。
阅读更多:
https://docs.aws.amazon.com/lambda/latest/dg/history.html
https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html
我认为目前尚无执行此操作的能力,但您可以尝试以下操作。
- 将您的 SQS 消费者 lambda 安排为 运行 每分钟
- 将消息消耗的最大数量设置为 60(秒)* 5 = 300
- 使用具有 5 个线程的固定线程池来调用第 3 方。如果需要,请在此代码中进行节流
希望对您有所帮助
我有一个 lambda 函数需要很长时间才能完成。它从 DynamoDB 读取记录,并针对每条记录执行对第 3 方服务的 HTTP 调用,然后将结果保存回 DynamoDB。我想扩大这个功能,以便它可以处理更多的记录。由于最大 lambda 持续时间可能会超过,因此需要重新设计。
解决方案似乎很明显。一个 lambda 从 DynamoDB 读取所有记录,而不是对所有记录发出 HTTP 请求,然后将消息发送到 SQS。另一个 lambda 侦听队列并仅对一部分数据执行此操作。两个 lambda 都很快。
问题: 第 3 方 API 我正在使用允许每秒仅调用 5 个请求。为了满足这个要求,我需要确保消耗 SQS 事件的 lambda 不超过第 3 方的并发限制 API。
是否可以限制 AWS Lambda 并行执行?
解决方案
我使用的最终解决方案类似于 programmersmurf 在下面的评论中提出的解决方案。
- 调度程序 Lambda 从 DynamoDB 读取所有记录并将消息发送到 SQS。它设置为 运行 凌晨 4 点
- worker Lambda 计划在凌晨 5 点工作,每天只触发一次
- worker Lambda 从 SQS 获取大量消息并并行发出 HTTP 请求
- 一旦 worker Lambda 完成并且消息数量为正,就会进行递归 Lambda 调用
- 如果收到的消息数量为 0,则处理终止
递归工作者 Lambda 调用的好处: - 无需手动调整触发器与消耗的 SQS 消息量 - 工人 Lambda 的执行之间没有停顿 - 作为最大吞吐量的结果
更新
Amazon 添加了通过设置控制 AWS Lambda 并发级别的功能。
阅读更多:
https://docs.aws.amazon.com/lambda/latest/dg/history.html https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html
我认为目前尚无执行此操作的能力,但您可以尝试以下操作。
- 将您的 SQS 消费者 lambda 安排为 运行 每分钟
- 将消息消耗的最大数量设置为 60(秒)* 5 = 300
- 使用具有 5 个线程的固定线程池来调用第 3 方。如果需要,请在此代码中进行节流
希望对您有所帮助