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

时间:2017-02-03 16:36:09

标签: amazon-web-services locking aws-lambda

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

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

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

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

4 个答案:

答案 0 :(得分:36)

答案 1 :(得分:15)

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

您可以将 Kinesis Streams 视为队列。最重要的是,您可以将 Kinesis Stream 用作 Trigger 作为 Lambda 功能。因此,插入此队列的任何内容都将按顺序自动传递给您的函数。因此,您将能够逐个处理这些 S3事件,一个Lambda执行一个接一个(一次一个实例)。

为了做到这一点,你需要创建一个 Lambda 函数,其简单目的是获取 S3 Events 并将它们放入 Kinesis Stream 。然后,您将 Kinesis Stream 配置为 Lambda Trigger

Event Flow

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

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

关于AWS May Webinar Series - Streaming Data Processing with Amazon Kinesis and AWS Lambda的更多信息。

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

P.S。请记住 Kinesis Streams 有自己的pricing。使用 DynamoDB + DynamoDB Streams 可能会更便宜(甚至免费,因为DynamoDB未过期Free Tier。)

答案 2 :(得分:11)

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

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

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

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

答案 3 :(得分:1)

有S3"举办活动"导致将消息放入队列(而不是涉及lambda函数)。该消息应包含对S3对象的引用。然后安排一个lambda到" SHORT POLL整个队列"。

PS: S3事件无法触发Kinesis Stream ...只有SQS,SMS,Lambda(请参阅http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations)。 Kinesis Stream价格昂贵,用于实时事件处理。