[英]Limit concurrent invocation of a AWS Lambda triggered from AWS SQS (Reserved concurrency ignored)?
对我来说,这在我开始时似乎是一个简单的用例,但结果比我预期的要难得多。
问题
我有一个 AWS SQS 作为触发工作人员 AWS Lambda 的作业队列。但是,由于工作人员 lambda 共享不可扩展的资源,因此将并发运行的 lambda 的数量限制为(为了举例)不超过很重要5 个 lambda 同时运行。
很简单,根据Managing Concurrency for a Lambda Function
预留并发也限制了function的最大并发数,对function整体适用
但是,将Reserved concurrency
-property 设置为 5 似乎被 SQS 完全忽略,在我的例子中,队列Messages in Flight
-property 显示接近 20-30 个并发执行,具体取决于放入队列的消息量。
问题
我最接近的解决方案是使用 SQS FIFO 队列并将MessageGroupId设置为随机选择或在 1-5 之间交替的值。 但是,由于工作负载不均匀,这并不是最佳选择,因为最好根据实际工作负载而不是偶然分配并发。
我还尝试使用 AWS Step Functions,因为Map-state有一个 MaxConcurrency 参数,这似乎适用于小型作业队列,但由于每个 state 的输入/输出限制为 32kb,这在我的使用中是不可行的-案件。
有没有人找到更好的或替代的解决方案? 应该使用Reserved concurrency
的任何其他方式吗?
相似的
这是我发现的一些类似问题,但我认为我的问题是不同的,因为我对限制调用总数不感兴趣,并且(虽然我自己没有尝试过)我看不出为什么从 S3 或 Kinesis Steam 触发与 SQS 的行为不同。
根据 AWS 文档,AWS SQS 不考虑保留并发。 如果要处理的批次数大于保留的并发数,您的消息可能最终会进入死信队列:
如果您的 function 返回错误,或者因为它处于最大并发状态而无法调用,则处理可能会通过额外的尝试成功。 为了在将消息发送到死信队列之前有更好的机会进行处理,请将源队列的重新驱动策略上的 maxReceiveCount 设置为至少 5。 https://docs.aws.amazon.com/lambda/latest/dg /with-sqs.html
此问题已于 2023 年 1 月今天解决。您可以按照此博客中的建议使用最大并发性。 我将 FIFO 与 groupid 一起使用,因为我的后端是不可扩展的,而且我不希望有任何节流问题,因为 DLQ 上有太多消息无济于事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.