减少 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 在下面的评论中提出的解决方案。

  1. 调度程序 Lambda 从 DynamoDB 读取所有记录并将消息发送到 SQS。它设置为 运行 凌晨 4 点
  2. worker Lambda 计划在凌晨 5 点工作,每天只触发一次
  3. worker Lambda 从 SQS 获取大量消息并并行发出 HTTP 请求
  4. 一旦 worker Lambda 完成并且消息数量为正,就会进行递归 Lambda 调用
  5. 如果收到的消息数量为 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

我认为目前尚无执行此操作的能力,但您可以尝试以下操作。

  1. 将您的 SQS 消费者 lambda 安排为 运行 每分钟
  2. 将消息消耗的最大数量设置为 60(秒)* 5 = 300
  3. 使用具有 5 个线程的固定线程池来调用第 3 方。如果需要,请在此代码中进行节流

希望对您有所帮助