减少lambda函数并行执行的限制?

时间:2017-05-22 21:54:47

标签: aws-lambda amazon-sqs

我有一个lambda函数,需要很长时间才能完成。它从DynamoDB读取记录,并且每条记录执行对第三方服务的HTTP调用,然后将结果保存回DynamoDB。我想扩展此功能,以便它可以处理更多的记录。需要重新设计,因为可以超过最大lambda持续时间。

解决方案似乎很明显。一个lambda从DynamoDB读取所有记录,而不是为所有人发出HTTP请求,向SQS发送消息。另一个lambda侦听队列并仅为一部分数据执行任务。两个lambdas都很快。

问题:我正在使用的第三方API允许每秒仅调用5个请求。为了满足这个要求,我需要确保消耗SQS事件的lambdas不超过第三方API的并发限制。

是否可以限制AWS Lambda并行执行?

解决方案

我使用的最终解决方案类似于 programmersmurf 在下面的评论中提出的解决方案。

  1. scheduler Lambda从DynamoDB读取所有记录并将消息发送到SQS。它将在凌晨4点运行
  2. 工作人员Lambda计划在凌晨5点工作,每天只触发一次
  3. worker Lambda从SQS获取大量消息并并行生成HTTP请求
  4. 一旦工作人员Lambda完成并且消息数量为正递归Lambda调用
  5. 如果收到的消息数为0,则处理终止
  6. 递归worker Lambda调用的好处: - 无需手动调整触发器与消耗的SQS消息量 - 执行工人Lambdas之间没有暂停 - 由于两者的最大吞吐量

    更新

    亚马逊增加了通过设置控制AWS Lambda并发级别的能力。

    了解更多:

    https://docs.aws.amazon.com/lambda/latest/dg/history.html https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html

1 个答案:

答案 0 :(得分:0)

我认为没有现成的功能,但您可以尝试下面这样的操作。

  1. 安排您的SQS消费者lambda每隔一分钟运行
  2. 将消耗的最大消息数设置为60(秒)* 5 = 300
  3. 使用5个线程的修复线程池来调用第三方。如果需要,请在此代码中进行限制
  4. 希望这有帮助