AWS lambda 限制来自特定事件源的并发调用

AWS lambda throttle concurrent invocations from a specific event source

我创建了动态 sqs 标准队列,用作我的 lambda 函数调用的事件源。每当将任何消息推入队列时,都会调用 lambda 函数。现在,我想在我的 lambda 函数上添加一些限制,比如单个事件源一次只能有一个 lambda 的活动调用。有一些 但它们只对限制整体 lambda 并发起作用。

来自Managing Concurrency for a Lambda Function

When a function has reserved concurrency, no other function can use that concurrency. Reserved concurrency also limits the maximum concurrency for the function, and applies to the function as a whole, including versions and aliases.

因此,预留并发可用于限制特定AWS Lambda函数的并发执行数。

简短的回答是可以,但只能以迂回的方式完成。

当您将 Lambda 函数设置为 SQS 队列上的触发函数时,Lambda 服务会轮询队列并处理队列中消息的接收和删除。您对 Lambda 服务读取多少消息以及 Lambda 服务调用多少函数实例的唯一控制是 (a) 批处理大小和 (b) 函数并发性。

当直接应用于您的函数时,这些都不会帮助您,因为将批量大小设置为较小的数字(例如 1)会导致启动更多实例(一次处理 1 条消息需要更长的时间),并且在您的情况下可能不希望将其设置为高数字,如果是这样,如果消息数量高于批处理大小或者它们被频繁接收并且您的功能已经忙于处理它仍然无济于事前一批。你已经说过函数并发是不行的,因为你只想限制源的并发,而不是整体。

所以这里有一个方法可以实现:创建另一个并发限制为 1 的函数,将其设置为触发函数而不是您的函数。该函数将接收消息,然后它将使用所述消息调用您的函数。它会在 return 自身之前等待您的函数 return。只有当新函数 returns 才能从 Lambda 服务接收另一个 message/batch,并再次调用您的函数。因此,您的 "real" 函数没有总体并发限制,但是您的 SQS 源(通过新函数)一次只有一个实例 invoked/running。

AWS Lambda 函数也可以从 Amazon SQS FIFO 队列中触发。

来自New for AWS Lambda – SQS FIFO as an event source | AWS Compute Blog

In SQS FIFO queues, using more than one MessageGroupId enables Lambda to scale up and process more items in the queue using a greater concurrency limit. Total concurrency is equal to or less than the number of unique MessageGroupIds in the SQS FIFO queue.

所以,如果您指定所有消息都具有相同的 MessageGroupId 并且批量大小为 1,那么它一次只会处理一条消息。