【问题标题】:Decrease limit of parallel executions of lambda function?减少 lambda 函数的并行执行限制?
【发布时间】: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 在下面的评论中提出的解决方案。

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


【解决方案1】:

我不认为现有的能力可以做到这一点,但是您可以尝试以下类似的方法。

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

希望对你有帮助

【讨论】:

  • 谢谢,这可以工作。非常感谢。我正在考虑另一种解决方案,即可以使用 TTL 发布消息。因此调度程序 lambda 可以发布具有增加 TTL 的消息。第一个 5 个 TTL 0,另一个 5 个 TTL 1,另一个 5 个 TTL 2,依此类推。实施仍有待完成。完成后我会更新这个帖子。
  • 我已经用我使用的解决方案更新了这个问题。它与本次按摩中提出的类似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2020-09-25
  • 1970-01-01
  • 2020-05-13
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多