AWS Lambda
开发人员指南

AWS Lambda 重试行为

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

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

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

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

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

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

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

      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 函数。如果调用失败或超时,则批处理中的所有消息都将返回到队列,而且每个消息可在可见性超时周期到期后进行处理。(可见性超时是 Amazon Simple Queue Service 阻止其他用户接收并处理消息的一段时间)。

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

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

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