与AWS Lambda重试失败功能相关的成本?

时间:2017-07-26 07:18:27

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

我正在研究无服务器技术(特别是AWS Lambda上的Python,Django和MDN documentation),关于错误处理的一件事让我感到震惊。在Zappa文档中它说

  

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

Zappa中,我读到了:

  

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

这是否意味着当一个函数引发未处理的异常时,它将被无限次调用?如果不加以控制,成本必须通过屋顶。

与此相关;什么是"直到流中的记录到期"?什么记录,什么流?

1 个答案:

答案 0 :(得分:1)

根据AWS docs

  • 非基于流的事件来源:如S3,API网关等

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

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

  • 基于流的事件源:与DynamoDB和Kinesis一样。

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

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

<强>问题

  

具体来说,当我的Lambda获得Kinesis事件并将数据写入另一个服务时......但是其他服务停止了一段时间(例如,几个小时)......我的Lambda将继续获得以恒定速率调用(和抛出错误)?

     

Lambda重试很好,因为我希望有保证的事件发送,但理想情况是在这种情况下,当我的Lambda在一段时间内一直保持成功时,我也不希望以高费率收费

<强>答案

  

如果函数开始执行但由于下游依赖性而失败,那么您将在函数运行的持续时间内收费。如果您的功能失败,Lambda会以指数方式退出,最多约一分钟。您还可以在ShardIteratorAge增加时监视此情况,并在需要时采取措施暂停流处理,直到您解决下游依赖关系