AWS Lambda
开发人员指南

了解重试行为

Lambda 函数可能会由于以下任意原因而失败:

  • 函数在尝试访问终端节点时超时。

     

  • 函数无法成功解析输入数据。

     

  • 函数遇到资源限制,例如内存不足错误或者其他超时。

如果出现任何这些错误,您的函数可能会引发异常错误。如何处理异常错误取决于 Lambda 函数的调用方式:

  • 并非基于流的事件源 - 这些事件源中的一部分设置为同步调用 Lambda 函数,另一些则异步调用。相应的异常处理方式分别如下:

     

    • 同步调用 - 发出调用的应用程序收到 429 错误并负责重试。有关支持的事件源列表及其使用的调用类型,请参阅支持的事件源。这些事件源可能会有内置到集成中的额外重试。

      如果您直接通过 AWS 开发工具包调用 Lambda 函数,则您的客户端会收到错误并可以选择重试。

       

    • 异步调用 – 使用异步事件调用 Lambda 函数之前会对它们进行排队。如果 AWS Lambda 无法完全处理事件,它将自动重试调用两次,且在重试之间有一定的延迟。如果为函数指定了一个死信队列,那么失败的事件将被发送到指定的 Amazon SQS 队列或 Amazon SNS 主题。如果保留默认设置,不指定死信队列 (DLQ) (非必需操作),那么系统将丢弃事件。有关更多信息,请参阅 死信队列

       

  • 基于轮询(或拉模型)事件源(基于流):这些包括 Kinesis Data Streams 或 DynamoDB。如果 Lambda 函数调用失败,AWS Lambda 尝试处理错误的记录批次,直至数据过期,这最多可以为七天。

    将异常作为阻塞处理,并且 AWS Lambda 不会从分区中读取任何新记录,直至失败的记录批次过期或者处理成功。这确保 AWS Lambda 按顺序处理流事件。

  • 基于轮询的事件源(非基于流):这包括 Amazon Simple Queue Service。如果您将 Amazon SQS 队列配置为事件源,AWS Lambda 将轮询队列中的一批记录并调用您的 Lambda 函数。如果失败,AWS Lambda 将继续处理批处理中的其他消息。同时,AWS Lambda 将继续重试处理失败的消息,直到出现以下情况之一:

    • 消息最终已成功调用:在这种情况下,消息将从队列中删除。

    • 消息保留期到期:在这种情况下,消息将被删除,或者如果您已配置 Amazon SQS 死信队列,失败信息将在这里为您定向,以供您分析。

如果您不需要有序地处理事件,使用 Amazon SQS 队列的优势是 AWS Lambda 将继续处理新消息,而不管上一条消息的失败调用。换句话说,将不会阻止处理新消息。

有关调用模式的更多信息,请参阅事件源映射