

# 了解 Lambda 中的重试行为
<a name="invocation-retries"></a>

直接调用函数时，您需要确定处理与函数代码相关的错误的策略。Lambda 不会自动代表您重试这些类型的错误。要进行重试，您可以说动重新调用函数，将事件发送到队列以进行调试，或者忽略该错误。您的函数代码可能已完全、部分或根本不运行。如要重试，请确保您的函数代码可以多次处理相同的事件，而不会导致重复的事务或其他不必要的副作用。

间接调用函数时，您需要了解调用者的重试行为以及请求在此过程中遇到的任何服务。这包括以下场景。
+ **异步调用** – Lambda 会针对函数错误重试两次。如果该函数没有足够的容量来处理所有传入请求，则事件可能会在队列中等待数小时才能发送到该函数。您可以在函数上配置死信队列以捕获未成功处理的事件。有关更多信息，请参阅 [添加死信队列](invocation-async-retain-records.md#invocation-dlq)。
+ **事件源映射** – 从流中读取的事件源映射将重试整个批次的项。重复错误会阻止受影响的分片的处理，直到错误得到解决或项失效为止。要检测停顿的分片，您可以监控[迭代器期限](monitoring-metrics.md)指标。

  对于从队列中读取的事件源映射，您可以通过在源队列上配置可见性超时和重新驱动策略来确定失败事件的重试次数以及目标之间的时间长度。有关更多信息，请参阅 [Lambda 如何处理来自基于流和队列的事件源的记录](invocation-eventsourcemapping.md) 以及 [使用来自其 AWS 他服务的事件调用 Lambda](lambda-services.md) 下特定于服务的主题。
+ **AWS服务** – AWS服务可能[同步](invocation-sync.md)或异步调用您的函数。对于同步调用，服务将决定是否重试。例如，如果 Lambda 函数返回 `TemporaryFailure` 响应代码，则 Amazon S3 批处理操作会重试该操作。代理来自上游用户或客户端的请求的服务可能具有重试策略，或者可能将错误响应中继回请求者。例如，API Gateway 始终将错误响应中继回请求者。

  对于异步调用，无论调用源如何，重试逻辑都是相同的。默认情况下，对于失败的异步调用，Lambda 最多会重试两次。有关更多信息，请参阅 [Lambda 如何处理异步调用的错误和重试](invocation-async-error-handling.md)。
+ **其他账户和客户端** – 当您向其他账户授予访问权限时，可以使用[基于资源的策略](access-control-resource-based.md)来限制可配置为调用您的函数的服务或资源。为了保护您的函数不发生过载情况，请考虑使用 [Amazon API Gateway](services-apigateway.md) 在您的函数前面放置一个 API 层。

为了帮助您处理 Lambda 应用程序中的错误，Lambda 集成了 Amazon CloudWatch 和 AWS X-Ray 等服务。您可以结合使用日志、指标、警报和跟踪来快速检测和识别函数代码，API 或支持您的应用程序的其他资源中的问题。有关更多信息，请参阅 [监控、调试 Lambda 函数并进行故障排除](lambda-monitoring.md)。