我的 AWS Lambda 函数返回“Rate exceeded”(超出速率)和“TooManyRequestsException”节流错误。
您的 Lambda 函数可能不会出现节流错误。在函数调用过程中,API 调用可能会出现节流。
要确认哪些资源受到节流限制,请检查您的 Amazon CloudWatch Logs 和指标中是否存在节流错误。如果没有 Lambda Throttles 指标,则节流发生在您的 Lambda 函数代码中的 API 调用上。
如果 API 调用受到节流限制,请确保在代码中使用指数回退来重试 API 调用。
**注意:**如果您需要更高的 API 调用每秒事务量 (TPS) 配额,请申请增加服务配额。并非所有配额都是可调整的。
在发生节流的 AWS 区域查看您的函数的 ConcurrentExecutions 指标。
查看 ConcurrentExecutions 的 Maximum 统计数据和 Throttles 的 Sum 统计数据。验证最大 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 中的重试行为
rePost Polyglot
已提问 3 年前
Tim
已发布 2 年前