速率限制
速率限制是指对客户端(通常是计算机或移动设备上的应用程序)在特定时间内向某项服务发出的请求数量设定上限的做法。 当客户端超过限制时,服务会拒绝或延迟后续请求(通常返回 HTTP 429 Too Many Requests 响应),直到时间窗口重置。 速率限制可保护服务免受过载影响,确保用户之间公平使用,并强制执行许多 API 所销售的使用层级方案。
简而言之:速率限制会限制您在特定时间窗口内可发出的请求数量,从而确保任何单个客户端都不会导致服务过载,也不会超出其已付费的套餐限额。
速率限制运行机制
服务会根据预设的额度,跟踪每个客户端的使用情况:
- 设置限制:服务会设定配额,例如每秒、每分钟或每月的请求次数,这些配额通常与 API 密钥或 IP 地址相关联。
- 请求计数:每个传入的请求都会通过某种算法计入配额,例如固定窗口在设定时间间隔重置计数;滑动窗口对过去 N 秒内的请求进行滚动计数;令牌桶则维护一个以恒定速率补充的动态配额。
- 允许或拒绝:如果客户端未超过限额,则请求继续处理;如果客户端超过限额,服务将返回 429 响应,而不进行处理。
- 向客户端发送信号:系统通过响应头告知流控状态。 如 RateLimit-Remaining 字段显示剩余配额,Retry-After 字段则告知客户端在重试前需要等待多长时间。
- 重置:当时间窗口结束时,配额将自动恢复,系统将再次接受请求。
其核心思想在于:速率限制是一种约定,而非故障:429 状态码表示服务方要求客户端降低请求速率,而非系统出现故障的信号。
速率限制对比流量控制与配额
- 速率限制和流量控制虽然常被混为一谈,但二者其实可以区分:速率限制会设定一个硬性上限,并对超过阈值的请求返回 429 状态码予以拒绝;而流量控制则会放缓处理速度或将超额请求放入队列,而非直接拒绝这些请求。
- 速率限制通常是指针对较短时间窗口(如每秒或每分钟)设定的上限;而配额通常是指在较长时间段内(如每天或每月)允许使用的较大额度。 API 通常会同时实施这两种限制。
- 429 响应表示客户端已超出配额限制,应暂停并根据 Retry-After 字段(若存在)或退避策略进行重试;503 响应则表示服务器不可用(无论是由于负载过高、维护还是其他服务器端问题),而非客户端配额问题。
何时需要进行速率限制
- 基于任何 API 进行构建:表现良好的客户端会遵守 Retry-After 规则,采用带抖动的指数退避机制(即每次重试之间的等待时间逐渐延长,并加入随机性以避免多个客户端同时重试),并监控 RateLimit-Remaining 以在达到上限前降低请求频率。
- 高吞吐量和智能体工作负载:一个在循环中发出大量调用的智能体搜索系统可能会很快达到限制,因此请求排队和退避机制至关重要。
- 抓取:当某个网站反复返回 429 状态码时,搜索爬虫会降低其抓取预算,直到该网站恢复正常响应为止。
- 搜索 API:搜索 API 会按套餐公布速率限制,通常为每秒和每月的请求数,因此选择套餐时需确保这些限制与您的预期查询量相匹配; 对 429 状态码的优雅处理可在流量激增时确保响应管道的可靠性,而更高且更可预测的限制主要影响吞吐量和客户端队列,其延迟带来的影响通常是间接的,且取决于工作负载。
速率限制是客户端与任何 API 之间协议的一部分:围绕这一机制进行设计,而不是与之对抗,才能确保集成在规模扩大时保持稳定。