【问题标题】:Limit concurrent invocation of a AWS Lambda triggered from AWS SQS (Reserved concurrency ignored)?限制从 AWS SQS 触发的 AWS Lambda 的并发调用(忽略保留并发)?
【发布时间】: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,在我的情况下,队列 @9​​87654328@-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


【解决方案1】:

根据 AWS 文档,AWS SQS 不考虑预留并发。如果要处理的批处理数大于保留的并发数,您的消息可能最终会进入死信队列:

如果您的函数返回错误,或者因为它位于 最大并发,处理可能会成功 尝试。让消息有更好的机会在之前被处理 将它们发送到死信队列,设置 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

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2020-02-15
    • 2020-07-28
    • 2019-05-14
    • 2018-03-01
    • 2018-01-12
    相关资源
    最近更新 更多