跳至内容

如何对 Lambda 函数的“Rate exceeded”(超出速率)和“TooManyRequestsException”节流错误进行故障排除?

1 分钟阅读
0

我的 AWS Lambda 函数返回“Rate exceeded”(超出速率)和“TooManyRequestsException”节流错误。

解决方法

验证哪些资源受到节流限制

您的 Lambda 函数可能不会出现节流错误。在函数调用过程中,API 调用可能会出现节流。

要确认哪些资源受到节流限制,请检查您的 Amazon CloudWatch Logs 和指标中是否存在节流错误。如果没有 Lambda Throttles 指标,则节流发生在您的 Lambda 函数代码中的 API 调用上。

检查您的函数日志和代码中是否有任何受节流限制的 API 调用

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

**注意:**如果您需要更高的 API 调用每秒事务量 (TPS) 配额,请申请增加服务配额。并非所有配额都是可调整的。

检查您的函数并发 CloudWatch 指标

在发生节流的 AWS 区域查看您的函数的 ConcurrentExecutions 指标。

查看 ConcurrentExecutionsMaximum 统计数据ThrottlesSum 统计数据。验证最大 ConcurrentExecutions 是否接近您在该区域的账户级别并发配额,以及 Throttles 图表中的相关数据点。

检查并发配额

检查您是否已超过函数区域的并发扩展速率。您的并发扩展速率为每 10 秒 1,000 个执行环境实例。有关详细信息,请参阅 Lambda 扩展行为

在 CloudWatch 控制台中 Lambda 的指标页面上,将图表的时间范围缩短到 1 分钟。如果您受到突发并发限制的限制,则您会在图表上看到 Throttles 的峰值,对应于 ConcurrentExecutions 的阶梯模式。

为避免突发并发限制,您可以配置预置的并发。您还可以请求提高 Lambda 函数的并发限制

检查函数的持续时间指标是否出现峰值

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

查看执行日志中的 Max Memory Used(最大已用内存)字段,并将该值与该函数的配置内存设置进行比较。如果 Max Memory Used(最大已用内存)接近配置的内存,则您的函数通常受内存限制。有关详细信息,请参阅确定 Lambda 函数的相应内存设置

配置预留并发

确认您为函数配置了预留并发。预留并发充当函数的并发边界,还可以保护该函数免受可能占用未预留并发的其他函数的侵害。虽然预留并发可以减轻函数节流,但它也可以无意中对函数施加节流限制。

使用 Lambda 控制台检查预留并发的设置。如果未配置预留并发,则该函数使用非预留并发。当函数调用超过非预留并发时,就会出现限制。

**注意:**如果您配置的函数的预留并发为零,则该函数会受到节流限制,因为它无法处理任何事件。请确保将该值增加到一个大于零的数字。

要配置或增加预留并发,请参阅为函数配置预留并发。要解决预留并发问题,请参阅如何解决 Lambda 预留并发问题?

使用指数回退

为避免出现节流错误,请在进行 API 调用时使用指数回退和重试。最佳做法是在应用程序中使用指数回退来为 Lambda 函数进行 API 调用。

有关详细信息,请参阅指数回退和抖动以及重试行为。确保在一段时间内分配您的 API 调用。随机安排操作,使其随时间推移而分散。

使用死信队列

对于异步事件源,例如 Amazon Simple Storage Service (Amazon S3)Amazon EventBridge 调度器使用死信队列配置您的函数。然后,验证异步调用配置的错误处理。死信队列捕获因持续节流而丢弃的所有事件,并可以保护您的数据。

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

申请增加服务配额

如果您的工作负载需要更高的并发执行服务配额,请申请增加服务配额

相关信息

使用 Lambda 函数的最佳实践

Lambda 中的调用问题疑难解答

了解 Lambda 中的重试行为

AWS 官方已更新 1 年前