对我来说,一开始这似乎是一个简单的用例,但结果比我预期的要困难得多。
Problem
我有一个 AWS SQS 作为作业队列,触发工作线程 AWS Lambda。然而,由于工作人员 lambda 共享不可扩展的资源,因此将并发运行的 lambda 数量限制为(为了示例)不超过 5 个同时运行的 lambda 非常重要。
很简单,根据管理 Lambda 函数的并发性 https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html
预留并发还限制了最大并发数
函数,并应用于整个函数
然而,设置Reserved concurrency
-property to 5似乎被SQS完全忽略,队列Messages in Flight
- 在我的例子中,属性显示接近 20-30 个并发执行,具体取决于放入队列的消息量。
Question
我最接近的解决方案是使用 SQS FIFO 队列并设置消息组ID https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html为随机选择或在 1-5 之间交替的值。但是,由于工作负载不均匀,这并不是最佳选择,因为最好按实际工作负载而不是偶然分配并发性。
我还尝试使用 AWS Step Functions 作为地图状态 https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-map-state.html有一个 MaxConcurrency 参数,该参数似乎在小型作业队列上运行良好,但由于每个状态的输入/输出限制为 32kb,这在我的用例中不可行。
有没有人找到更好或替代的解决方案?还有其他方法吗Reserved concurrency
应该使用吗?
Similar
这是我发现的一些类似的问题,但我认为我的问题是不同的,因为我对限制调用总数 https://stackoverflow.com/questions/51202756/aws-lambda-sqs-trigger-throttle-limit,并且(虽然我自己没有尝试过)我不明白为什么来自 S3 或 Kinesis Steam 的触发器 https://stackoverflow.com/questions/42028897/can-i-limit-concurrent-invocations-of-an-aws-lambda其行为与 SQS 不同。