我可以限制AWS Lambda的并发调用吗?
我有一个Lambda函数,由PUT触发到S3存储桶。我可以限制AWS Lambda的并发调用吗?
我想限制这个Lambda函数,以便它一次只运行一个实例 - 我不希望两个实例同时运行。
我已浏览了Lambda配置和文档,但看不到任何明显的内容。我可以写自己的锁定系统,但如果这已经是一个解决的问题,那将会很好。
如何限制Lambda的并发调用数量?
不,这是我真的很希望看到Lambda支持的事情之一,但目前情况并非如此。其中一个问题是,如果有很多S3 PUT操作发生,AWS将不得不以某种方式排队所有的Lambda调用,目前还没有支持。
如果您在Lambda函数中构建了锁定机制,您将如何处理由于锁定而无法处理的请求?你会抛出S3通知吗?
大多数人推荐的解决方案是让S3将通知发送到SQS队列,然后让您的Lambda函数定期运行(例如每分钟一次),并检查队列中是否存在需要被处理。
或者,让S3向SQS发送通知,并且只有一个带有单线程服务的t2.nano EC2实例轮询队列。
我建议你使用Kinesis Streams(或者DynamoDB + DynamoDB Streams,它们本质上具有相同的行为)。
你可以看到Kinesis Streams如队列。好的部分是你可以使用Kinesis Stream作为触发器给你Lambda函数。因此,插入此队列的任何内容都将按顺序自动传递到您的函数。所以你将能够进程那些S3事件一个接一个,一个Lambda执行后另一个(一次一个实例)。
为了做到这一点,你需要创建一个LAMBDA功能与得到S3活动并把它们放入一个室壁运动流的目的很简单。然后,您将配置Kinesis Stream作为您的Lambda触发器。
在配置室壁运动流为您拉姆达触发我建议您使用以下配置:
-
批量大小:1
- 这意味着你的Lambda将被称为只有一个事件从Kinesis。您可以选择更高的数字,并且您将获得该大小的事件列表(例如,如果要在一次Lambda执行中处理最后10个事件,而不是连续执行10次Lambda)。
- 起始位置:修剪地平线
多一点信息。
我希望这可以帮助任何有类似问题的人。
P.S.请记住,Kinesis Streams有自己的pricing。使用DynamoDB + DynamoDB Streams可能会更便宜(甚至免费,因为DynamoDB的非到期日期Free Tier)。
这个答案太棒了! OP应该真的接受它作为解决方案。 – GavinoGrifoni
让S3“Put事件”使消息放置在队列中(而不是涉及lambda函数)。该消息应包含对S3对象的引用。然后安排一个lambda到“short poll the whole queue”。
PS: S3事件无法触发Kinesis Stream ...仅限SQS,SMS,Lambda(请参阅http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations)。 Kinesis Stream非常昂贵,用于实时事件处理。
AWS LAMBDA现在支持在各个功能并发限制: https://aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/
这真棒。在S3上更新文件时,我能够解决并发问题。我使用lambda函数来更新S3上的一个文件,使用并发计数为1.这确保了一次只有一个ec2实例具有对文件的写入访问权限。这比使用AWS上的任何托管数据库进行微不足道的使用便宜得多。 –
有兴趣,为什么你关心多少调用同时运行。 – jarmod
@jarmod当时我正在考虑在Lambdas中运行Terraform更改,并且我不知道如何在Terraform本身中执行远程状态锁定。我放弃了这个想法 - 部分原因是您不能限制并发的Lambdas,部分原因是我担心五分钟的超时。 – alexwlchan