【发布时间】:2020-07-21 11:25:42
【问题描述】:
在我开始时,这似乎是一个简单的用例,但结果比我预期的要困难得多。
问题
我有一个 AWS SQS 作为触发工作人员 AWS Lambda 的作业队列。然而,由于工作 lambdas 共享不可扩展的资源,因此将并发运行的 lambdas 的数量限制为(例如)不超过 5 个同时运行的 lambdas 是很重要的。
够简单,根据Managing Concurrency for a Lambda Function
预留并发还限制了最大并发 函数,并应用于整个函数
但是,SQS 似乎完全忽略了将 Reserved concurrency-property 设置为 5,在我的情况下,队列 @987654328@-property 显示接近 20-30 个并发执行,具体取决于放入排队。
问题
我最接近的解决方案是使用 SQS FIFO 队列并将MessageGroupId 设置为随机选择或在 1-5 之间交替的值。但是,由于工作负载不均匀,这并不是最优的,因为最好让并发由实际工作负载而不是偶然分配。
我也尝试过使用 AWS Step Functions,因为 Map-state 有一个 MaxConcurrency 参数,这似乎在小型作业队列上运行良好,但由于每个状态的输入/输出限制为 32kb,这是不可行的在我的用例中。
有没有人找到更好或替代的解决方案? Reserved concurrency 应该有其他使用方式吗?
类似
这里有一些我发现的类似问题,但我认为我的问题有所不同,因为我对限制total number of invocation 不感兴趣,而且(虽然我自己没有尝试过)我不明白为什么triggers from S3 or Kinesis Steam 会行为与 SQS 不同。
【问题讨论】:
-
您确定有超过 5 个 lambdas 正在运行吗?仅仅因为消息在飞行中并不意味着它有自己的专用 lambda 运行。 SQS 不知道允许运行多少个 lambda,它会将其作业发送出去,然后 lambda 会处理它们,但它会处理它们。 SQS 只是确保它们得到处理。可能只是您的 5 个 lambdas 中的每一个都按顺序处理 4-6 个作业。 SQS 的任何内容都不能覆盖预留并发。
-
要基于 @bryan60 的评论,您可以使用 CloudWatch 指标和日志来验证并发执行的数量。如果处理的消息多于预期,也可能是批量大小?
-
@bryan60,是的,事实证明你和 hephalump 是对的。 Messages in Flight,似乎不是一个准确的表示,至少根据 lambda 的监控统计数据,执行的并发 lambda 不超过 5 个。
-
@bryan60,但是,这引发了一些问题,当 lambda 被限制时,如何处理可见性超时。如果有人感兴趣,我创建了一个后续问题。 stackoverflow.com/questions/61116499/…
标签: amazon-web-services aws-lambda