【问题标题】:Why does AWS Lambda run in "bursts" every 15 minutes?为什么 AWS Lambda 每 15 分钟“爆发”一次?
【发布时间】:2020-12-14 10:30:46
【问题描述】:

首先,这里简要介绍一下我的 Lambda 函数的工作原理:

  1. 由到达 SQS 标准队列的消息触发
  2. 保留并发设置为 4
  3. 每条 SQS 消息都包含一个图像列表的 URL,Lambda 函数将其传输到 S3 存储桶

简而言之: SQS -> Lambda -> S3

在这个测试中: SQS 队列有 100 条消息,每条平均包含 5 个图像 URI。每张图片的平均大小为 10 MB。

我期望 Lambda 实例连续运行,直到 SQS 队列为空。相反,我看到的是这样的:

看起来 Lambda 函数每 15 分钟“爆发”一次。我的第一个猜测是,这是我在第一次部署 Lambda 时在配置中设置的,但不幸的是,我不太记得那些初始设置是什么。除了节流和超时设置,我现在似乎也无法更改任何内容。

知道这里发生了什么吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    来自Managing concurrency for a Lambda function - AWS Lambda

    当一个函数保留并发时,没有其他函数可以使用该并发。保留并发还限制了函数的最大并发,并适用于整个函数,包括版本和别名。

    由于您将预留并发设置为 4,因此只有 4 个函数将并行运行。

    因此,Lambda 似乎触发了 4 个函数,等待一个函数完成,然后运行下一个函数。我假设您的函数运行大约需要 10-15 秒,从而导致您看到的行为。

    除非您有特殊原因需要保留并发,否则我建议您删除该设置。

    【讨论】:

    • 抱歉,我刚刚意识到爆发似乎每 15 分钟发生一次,而不是几秒钟。我已经更正了我的原始帖子以反映这一点。最大持续时间图建议我的函数运行时间不到一分钟,但成功率图仅每 15 分钟报告一次成功/失败。在这 15 分钟的间隔内,我也没有看到任何图像被上传到 S3 存储桶,对我来说,这表明在那段时间内没有任何工作要做。那么为什么 Lambda 似乎处于闲置状态并且每 15 分钟才触发一次呢?会不会和 SQS 队列有关?
    • 我建议查看 Amazon CloudWatch Logs 中的日志(可通过 Lambda 函数上的监控选项卡访问)以更好地了解正在发生的事情。
    【解决方案2】:

    我知道为什么会发生这种情况,但不幸的是除了增加保留并发之外没有其他解决方案。

    这与在较低的保留并发设置下运行的 SQS 触发的 Lambda 有关。长话短说,每次 SQS 尝试向 Lambda 函数传递消息时,一个或多个批次的传递可能会由于缺少可用的 Lambda 实例而失败,并且这些消息最终会停留在飞行中,直到达到 SQS 可见性超时(在我的情况下是 15 分钟)。此时循环将重复。如果您为 SQS 配置了 DLQ,那么您可能会看到一些消息在它们失败的次数足够多后最终会出现在其中。

    更详尽的解释请看这篇文章:https://medium.com/@zaccharles/lambda-concurrency-limits-and-sqs-triggers-dont-mix-well-sometimes-eb23d90122e0

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 2018-06-06
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多