AWS Lambda
开发人员指南

AWS Lambda 重试行为

出于多种原因,函数调用可能会导致错误。您的代码可能引发异常、超时或用尽内存。执行您的代码的运行时可能会遇到错误并因此停止。您可能会用尽并发限额并受到阻止。

当发生错误时,您的代码可能已经完全、部分运行,或者完全不运行。大多数情况下,当调用您的函数的客户端或服务遇到错误时,它们会重试,因此,您的代码必须具有重复处理相同事件而不会产生意外结果的能力。如果您的函数管理资源或写入数据库,则您需要处理多次发出同一请求的情形。

Lambda 以下列方式处理重试,具体取决于调用源。

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

    • 同步调用 – Lambda 在响应正文中包括 FunctionError 字段,并在 X-Amz-Function-Error 标头中包括错误的详细信息。函数错误的状态代码为 200。只有在出现阻止处理程序处理事件的请求、函数或权限问题时,Lambda 才返回错误状态代码。有关详细信息,请参阅调用错误

      AWS 服务触发器会进行重试,具体取决于服务。如果您直接从您的应用程序调用 Lambda 函数,您可以选择是否重试。

    • 异步调用 – 使用异步事件调用 Lambda 函数之前会对它们进行排队。如果 AWS Lambda 无法完全处理事件,它将自动重试调用两次,且在重试之间有一定的延迟。配置死信队列,以便让您的函数捕获所有三次尝试都失败的请求。

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

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

  • 基于轮询的事件源(非基于流) – 这包括 Amazon Simple Queue Service。如果您将 Amazon SQS 队列配置为事件源,AWS Lambda 将轮询队列中的一批记录并调用 Lambda 函数。如果调用失败或超时,则批处理中的所有消息都将返回到队列,而且每个消息可在可见性超时周期到期后进行处理。(可见性超时是 Amazon Simple Queue Service 阻止其他用户接收并处理消息的一段时间)。

    一旦调用成功处理某个批处理,则该批处理中的每个消息都将从队列中删除。如果未成功处理消息,消息将被删除,或者您已配置 Amazon SQS 死信队列,失败信息将在这里为您定向,以供您分析。

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

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