繁体   English   中英

限制从 AWS SQS 触发的 AWS Lambda 的并发调用(忽略预留并发)?

[英]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

详情可以查看这篇文章: https://zaccharles.medium.com/lambda-concurrency-limits-and-sqs-triggers-dont-mix-well-sometimes-eb23d90122e0

此问题已于 2023 年 1 月今天解决。您可以按照此博客中的建议使用最大并发性。 我将 FIFO 与 groupid 一起使用,因为我的后端是不可扩展的,而且我不希望有任何节流问题,因为 DLQ 上有太多消息无济于事。

临界强化

https://aws.amazon.com/blogs/compute/introducing-maximum-concurrency-of-aws-lambda-functions-when-using-amazon-sqs-as-an-event-source/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM