我可以限制AWS Lambda的并发调用吗?

ale*_*han 43 locking amazon-web-services aws-lambda

我有一个由PUT触发到S3存储桶的Lambda函数.

我想限制这个Lambda函数,以便它一次只运行一个实例 - 我不希望两个实例同时运行.

我已经看过Lambda配置和文档了,但我看不出任何明显的东西.我可以编写自己的锁定系统,但如果这已经是一个已解决的问题,那就太好了.

如何限制Lambda的并发调用次数?

Rob*_*hen 54

AWS Lambda现在支持各个功能的并发限制:https: //aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/

在此输入图像描述

  • 这个功能很奇怪。我的用例只是想将特定计划函数的执行限制为不超过一个实例(上限)。但启用并发限制似乎会带来阻止任何其他 Lambda 使用保留部分的缺点。因此,如果您有 100 个不经常运行的 Lambda,但每个 Lambda 的并发限制为 10,则无论它们是否实际运行,您账户的所有 Lambda 容量都会被占用。我可能会做其他事情,比如让额外的执行开始,但检查外部锁等。 (11认同)
  • 是的,我们也陷入了这种想法,它只会将函数的最大并发数限制为 1,但似乎它从帐户中其他 Lambda 使用的池中取消分配它。他们需要添加“最大并发”设置。 (3认同)
  • @TemporaryFix“保留并发”**确实**设置上限,并且它从帐户的“公共”池中删除并发“单位”。通过测试验证行为。 (3认同)
  • 这太棒了。我能够解决在 S3 上更新文件时的并发问题。我正在使用 lambda 函数来更新 S3 上的文件,并发计数为 1。这可确保一次只有一个 ec2 实例对该文件具有写访问权限。这比在 AWS 上使用任何托管数据库进行简单使用要便宜得多。 (2认同)
  • 我知道这已经有两年了,但这解决了我遇到的问题。谢谢你! (2认同)
  • 这真的是100%保存吗?我做了一些研究,如果我理解正确的话,如果您收到大量消息,您可能会因限制而导致大量有效消息失败。如这篇详细文章中所述:https://data.solita.fi/lessons-learned-from-combining-sqs-and-lambda-in-a-data-project/ 您如何配置可见性超时等? (2认同)
  • 我认为这并没有真正设定上限。这仅保留了 x 数量的 lambda,以便在发生突发请求时可用。 (2认同)

小智 18

我建议你使用Kinesis Streams(或者DynamoDB + DynamoDB Streams,它们基本上具有相同的行为).

您可以将Kinesis Streams视为队列.好的一面是,你可以使用的Kinesis流作为触发LAMBDA功能.因此,插入此队列的任何内容都将按顺序自动传递给您的函数.因此,您将能够逐个处理这些S3事件,一个Lambda执行一个接一个地执行(一次一个实例).

为了做到这一点,你需要创建一个Lambda函数,其目的很简单,即获取S3 Events并将它们放入Kinesis Stream中.然后,您将Kinesis Stream配置为Lambda触发器.

事件流程

当您将Kinesis Stream配置为Lambda触发器时,我建议您使用以下配置:

  • 批量大小:1
    • 这意味着使用Kinesis中的一个事件调用您的Lambda.您可以选择更高的数字,然后您将获得该大小的事件列表(例如,如果您要在一个Lambda执行中处理最后10个事件而不是10个连续的Lambda执行).
  • 起始位置:修剪地平线
    • 这意味着它将表现为队列(FIFO)

有关AWS May网络研讨会系列的更多信息- 使用Amazon Kinesis和AWS Lambda进行流数据处理.

我希望这可以帮助任何有类似问题的人.

PS请记住,Kinesis Streams有自己的定价.使用DynamoDB + DynamoDB流可能会更便宜(甚至免费,因为DynamoDB 的非过期免费层).

  • 为了确保行为准确,您还需要一项配置: **Kinesis Shard Count: 1** 在多分片 _Kinesis Stream_ 中,每个流会触发一个 _Lambda_,因此我们可以并行执行多个 _Lambda_。 (5认同)

Mar*_*k B 11

不,这是我非常希望看到Lambda支持的事情之一,但目前还没有.其中一个问题是,如果发生了大量的S3 PUT操作,AWS必须以某种方式排队所有Lambda调用,并且目前不支持这种情况.

如果您在Lambda函数中构建了一个锁定机制,那么对于由于锁定而未处理的请求,您将如何处理?你会把那些S3通知扔掉吗?

大多数人建议的解决方案是让S3将通知发送到SQS队列,然后将Lambda函数安排定期运行,例如每分钟一次,并检查队列中是否有需要处理的项目.

或者,让S3将通知发送到SQS并且只有一个t2.nano EC2实例,其中单线程服务轮询队列.


小智 5

我知道这是一个旧线程,但我遇到了它,试图弄清楚如何确保我的时间排序 SQS 消息按照从 FIFO 队列出来的顺序进行处理,而不是通过多个 Lambda 同时/无序处理线程正在运行。

根据文档:

对于 FIFO 队列,Lambda 按照接收消息的顺序将消息发送到您的函数。当您向 FIFO 队列发送消息时,您需要指定消息组 ID。Amazon SQS 确保同一组中的消息按顺序传送到 Lambda。Lambda 将消息分组,并为一组一次仅发送一批。如果您的函数返回错误,该函数会在 Lambda 接收来自同一组的其他消息之前尝试对受影响的消息进行所有重试。

您的函数可以根据活动消息组的数量调整并发量。

链接: https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

因此,本质上,只要您使用 FIFO 队列并使用相同的 MessageGroupID 提交需要保持顺序的消息,SQS/Lambda 就会自动处理排序,无需任何额外的设置。