【问题标题】:Costs related to AWS Lambda retrying failing function?与 AWS Lambda 重试失败功能相关的成本?
【发布时间】:2017-07-26 07:18:26
【问题描述】:

我正在研究无服务器技术(特别是 AWS Lambda 上的 Python、Django 和 Zappa),关于错误处理的一件事让我印象深刻。在 Zappa 文档中它说

默认情况下,如果抛出异常,AWS Lambda 将尝试重试基于事件(非 API 网关,例如 CloudWatch)的调用。

AWS Lambda documentation,我读到:

根据事件源,AWS Lambda 可能会重试失败的 Lambda 函数。例如,如果 Kinesis 是事件源,AWS Lambda 将重试失败的调用,直到 Lambda 函数成功或流中的记录过期。

这是否意味着一个函数在引发未处理的异常时将被无限次调用?如果这种情况继续下去,成本肯定会飙升。

与此相关; “直到流中的记录过期”是什么意思?什么记录,什么流?

【问题讨论】:

    标签: python amazon-web-services aws-lambda serverless-architecture


    【解决方案1】:

    根据AWS docs

    • 不基于流的事件源:如 S3、API Gateway 等。

      • 同步调用:如果您使用 SDK 或 API 网关调用了 Lambda,如果发生异常,您将负责决定是否/何时/如何重试请求。 p>

      • 异步调用:如果 Lambda 是通过异步调用(如 S3)触发的,它将自动重试两次调用,重试之间会有延迟。如果您已指定死信队列,则失败事件将发送到 SQS/SNS。如果未指定 DLQ,则该事件将被丢弃。

    • 基于流的事件源:如 DynamoDB 和 Kinesis。

      • 如果 Lambda 函数失败,它将继续尝试直到数据过期(Kinesis 最多 7 天)。它在两次重试之间以 1 分钟为上限的指数退避后重试。您将为所有重试付费,但您可以创建警报以在源离线时触发和停止流。

    有关基于流的事件源的文档不是很准确,但您可以在 AWS 论坛中阅读 this thread,其中 AWS 员工已回答了有关此问题的问题:

    问题

    具体来说,当我的 Lambda 正在获取 Kinesis 事件并将数据写入另一个服务时......但另一个服务关闭了一段时间(例如,几个小时)......我的 Lambda 是否会继续获取以恒定的速率调用(并抛出错误)?

    Lambda 重试很好,因为我希望有保证的事件交付,但理想情况下,我也不希望在我的 Lambda 一段时间内持续不成功时被收取高额费用

    回答

    如果函数开始执行但由于下游依赖性而失败,那么您确实需要为函数运行的持续时间付费。如果您的函数失败,Lambda 会以指数方式回退,最多大约一分钟。您还可以在 ShardIteratorAge 增加时对此进行监控,并在需要时采取措施暂停流处理,直到您解决下游依赖项

    【讨论】:

    • 谢谢!说清楚一点:如果在同步调用后发生异常,请求默认重试?
    • 如果是同步调用,默认情况下重试请求。我确信 Lambda 不会自动重试,因为我几天前已经对此进行了测试,并且日志消息只显示了我自己调用的消息。
    猜你喜欢
    • 2018-11-13
    • 2017-01-05
    • 2019-05-18
    • 2013-11-06
    • 2023-01-02
    • 2016-03-05
    • 2019-05-27
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多