如何排查出现 "Rate exceeded" 和 429 "TooManyRequestsException" 错误时的 Lambda 函数节流问题?

2 分钟阅读
0

我的 AWS Lambda 函数出现 "Rate exceeded" 和 429 "TooManyRequestsException" 错误。

解决方法

Lambda 函数有时会被限流,以保护您的资源和下游应用程序。虽然 Lambda 自动扩展可适应您的传入流量,但您的函数仍可能因多种原因遭节流。

要解决 Lambda 节流问题(包括 Rate exceededTooManyRequestsException 错误),请查看以下步骤。

验证哪些资源遭节流

限流错误可能不是来自您的 Lambda 函数。函数调用期间可能会对 API 调用进行节流。

要确认哪些资源受到节流,请检查以下资源。

检查您的 Amazon CloudWatch Logs,查看 Lambda Throttles 指标中是否存在节流错误,但是没有相应的数据点

如果不存在 Lambda Throttles 指标,则说明 Lambda 函数代码中的 API 调用发生了限流。

检查函数代码以确定任何受到限流的 API 调用

如果特定的 API 调用受到节流,请确保使用代码中的指数回退来重试 API 调用。

**注意:**如果某个 API 调用需要更高的每秒事务处理数 (TPS) 配额,则您可以请求提高服务配额。并非所有配额都可以调整。

检查您函数的并发指标

检查 Amazon CloudWatch 中的 Lambda 指标

在您看到限流的 AWS 区域检查您的函数 ConcurrentExecutions 指标。

比较 ConcurrentExecutions 指标和 Throttles 指标,确认时间戳是否相同

查看 ConcurrentExecutions 指标的 Maximum 统计数据,以及 Throttles 指标的 Sum 统计数据。检查 ConcurrentExecutions 的最大值是否接近您在该区域的账户级别并发配额,此外还需检查 Throttles 图中对应的数据点。

检查您是否超出了特定 AWS 区域的初始突增并发配额

在 CloudWatch 控制台中,进入 Lambda 指标页面,将图的时间范围缩短至 1 分钟。如果您受到突发扩展的限制,那么您会看到一个与图中 ConcurrentExecutions 的阶梯模式相对应的 Throttles(节流)峰值。

**注意:**要解决突增并发限制问题,您可以配置预置并发

检查函数的 Duration 指标是否出现峰值

并发取决于函数的持续时间。如果函数代码完成所需时间太长,则可能没有足够的计算资源。

请尝试增加函数的内存设置。然后使用 AWS X-RayCloudWatch Logs 来排查持续时间增加的原因。

**注意:**更改内存设置可能会影响有关执行时间的费用。

您可以将该功能添加到 Amazon Virtual Private Cloud (Amazon VPC)。当函数在 Amazon VPC 中时,请查看我如何为连接到 Amazon VPC 的 Lambda 函数提供互联网访问权限?

检查函数的 Errors 指标是否有增加

错误增加可能会导致重试并造成调用数量的总体增加。调用增加可能会导致并发增加。使用 CloudWatch Logs 来识别和消除错误,并利用函数代码来处理异常。

**注意:**您的函数也会依据每个区域的调用请求数(每秒请求数)受到节流,这是您并发执行配额的 10 倍。

配置预留并发

确认您是已在您的函数上配置了预留并发

使用 Lambda 控制台检查设置,或调用 GetFunction API。

**注意:**如果您配置某个函数,以便为零预留并发,则该函数将被节流,因为它无法处理任何事件。请务必将该值增加到一个大于零的数字。

CloudWatch 中查看您的函数的最大统计数据

查看函数指标是否在任何时候都达到 ConcurrentExecutions 指标的最大值。

将函数的预留并发增加到某个能使其避免节流的并发值

使用 Lambda 控制台更改设置,或调用 PutFunctionConcurrency API。

在应用程序中使用指数回退

要重试被节流的请求,最佳实践是在调用 Lambda 函数的应用程序中使用指数回退

使用死信队列

对于异步事件源,诸如 Amazon Simple Storage Service (Amazon S3)Amazon EventBridge请使用死信队列 (DLQ) 来配置您的函数。DLQ 可以捕获任何由于不断节流而被丢弃的事件,并且可以在您遇到明显的节流时保护您的数据。

**注意:**对于 Amazon Simple Queue Service (Amazon SQS) 事件源,您必须在 Amazon SQS 队列上配置 DLQ。

请求提高服务配额

如果您的工作负载需要更高的并发执行的服务配额,则使用服务配额控制台请求增加服务配额


相关信息

使用 AWS Lambda 函数的最佳实践

排查 AWS Lambda 中的调用问题

AWS Lambda 中的错误处理和自动重试

相关视频

AWS 官方
AWS 官方已更新 1 年前