你正连着调接口,前面还好好的,突然一串请求全被拒,返回里写着 429。别急着去改 Key 或者怀疑账号被封,先分清是「短时间请求太密」还是「用量额度到顶」,两条路的处理方式完全不同。这篇按排查顺序走一遍:先看报错原文和响应头,再定位触发条件,最后给出客户端重试、请求削峰、换通道三类可落地的做法,并说明哪些情况下这些招不管用。
你正连着调接口,前面还好好的,突然一串请求全被拒,返回里写着 429。别急着改 Key,也别怀疑账号被封。先分清是「短时间请求太密」还是「用量额度到顶」,这两条路的处理方式完全不同。
这篇按排查顺序走一遍:先看报错原文和响应头,再定位触发条件,最后给出客户端重试、请求削峰、换通道三类可落地的做法,并说明哪些情况下这些招不管用。
429 到底在说什么:先分清三种触发场景
429 的字面意思是「请求太多」,它是服务端主动拒绝,不是你的代码语法错,也不是 Key 失效。它通常出现在三个位置:单位时间请求条数超限、同时在跑的请求数超限、账户可用额度或配额用尽。前两种等一会儿往往自己会好,第三种不处理会一直报。
| 触发场景 | 典型信号 | 处理方向 |
|---|---|---|
| 单位时间请求条数超限 | 请求间隔很近,单个请求本身很小 | 客户端限速、退避重试 |
| 并发数超限 | 同时发出的请求多,单条请求可能很大 | 降低并发、排队削峰 |
| 额度或配额用尽 | 一直报,等待也不恢复 | 等重置、提额或换额度来源 |
这三类的判断依据不在状态码本身,而在响应体文字和响应头字段里。拿不准错因时,可以先到站内的错误代码对照页看当时对 429 相关文本的说明,再决定往下走哪条路。
别只看状态码:报错原文和响应头才是线索
先把完整响应体打出来。里面的英文短语通常直接点明是频率、并发还是配额。很多 SDK 只抛出状态码,你自己加一行日志把原始响应打全,定位速度会差很多。
- 看响应头里的重试等待时间、剩余额度、限流窗口这类字段,它们决定你该等多久;
- 记录报错发生的时间点、当时并发数、单次请求的 token 量,这三项是定位的关键输入;
- 如果同一段代码在本地不报、在服务器上报,优先怀疑出口 IP 或并发调度,而不是代码逻辑;
- 把报错前后的几条请求日志一起留档,单看一条日志往往看不出触发条件;
- 常见错误文本的含义可以去站内的错误代码对照页查,比搜索引擎瞎猜快。
一套排查顺序:从复现到定位,五步走完
- 单发最小请求一句话、不带工具调用、不带长上下文,确认接口本身还通。如果不通,问题不在限速。
- 把并发压到 1如果立刻恢复正常,问题就在请求密度而不是账号额度。这一步能把两类原因分开。
- 找临界点逐步把并发和频率加上去,找到开始报错的那个点,记下来当作你自己的水位线,后面限速就按它留余量。
- 查代码里的密集调用看看是不是某个批量任务或循环里漏了等待,很常见的是 for 循环里连着打,或者一次任务里塞了几十个并行请求。
- 核对额度口径到站内的用量或额度相关页面核对当前消耗口径,排除是配额而不是限速。注意各家的统计口径可能不一样,以站内页面的说明为准。
五步走完基本能定性。如果第二步并发降下来就好了,说明是限速;如果一直报且额度页显示已经见底,说明是配额,客户端再怎么优化也只是拖时间。
客户端能做的基本功:重试、退避、削峰、缓存
确认是限速之后,客户端有不少能立刻做的事。核心思路是把突发请求摊平,而不是在被拒之后猛打。
- 重试要带指数退避并加随机抖动,别用固定间隔猛打,否则只会把窗口一直顶满;
- 只对可重试的错误重试,参数错、鉴权错这类重试多少次都没用,反而浪费额度;
- 用队列把突发请求摊平,或者把一批小请求合并成一个批量请求,减少请求条数才是根本;
- 结果能缓存的就缓存,重复问同一件事没必要每次都打接口;
- 给重试设上限和总超时,避免任务卡死在一个永远失败的分支里。
这些做法对「频率被限」有效,对「额度用完」无效。额度用完只能等重置或换额度来源。另外,退避重试会拉长单个请求的完成时间,如果你的业务对延迟敏感,就要在接受延迟和保持成功率之间做取舍。
# 伪代码示意:带抖动退避的重试
# 只对可重试错误进入重试分支
# 每次等待 = 基础间隔 * 2^重试次数 + 随机抖动
# 设置最大重试次数与总超时,超限直接失败并告警这些办法解决不了的时候,该换的是通道不是代码
如果业务量本身就需要更高并发,而当前通道的上限是硬限制,再怎么优化客户端也只是拖时间。这时候的选项是申请提额、换承载能力更高的一档,或者把流量分散到多条通道。
| 现象 | 说明什么 | 下一步 |
|---|---|---|
| 并发降到 1 就正常 | 频率或并发的硬限制 | 确认是否需要提额或分流 |
| 一直报且额度见底 | 配额用尽 | 等重置或换额度来源 |
| 换了通道还是报 | 可能是防滥用拦截 | 回到报错原文看具体措辞 |
| 只有某个出口 IP 报 | 出口侧被限 | 换出口或加多出口调度 |
多通道分流要处理一致性和失败切换,别为了躲 429 把逻辑搞成一团。选通道前建议先到站内的中转站目录和检测相关页面看当时的可用性与限速口径。
另外,多通道意味着多份账要对,日志里要带上通道标识,否则出问题很难查到是哪条路在报。什么时候不适用:如果你只是偶尔跑一次脚本,为了躲 429 去搭多通道,成本远高于把并发降下来。
429 不是让你改代码的信号,是让你先看清哪里被卡住的信号。
常见问题
429 和 401、403 有什么区别,我该先看哪个?
401 一般是鉴权没过(Key 错、没带),403 是没有权限或被拒,429 是你被允许调用但当下太频繁或没额度了。看状态码就能初步分流:先确认真的是 429,再往限速和额度两个方向查,不要在鉴权上浪费时间。
加了重试还是报 429,是不是重试没用?
多半是重试方式不对。固定间隔重试、重试次数无上限、或者一边重试一边继续发新请求,都会让限流窗口一直满着。正确做法是指数退避加随机抖动、设重试上限,并且先把并发压到低位确认能通,再慢慢往上加。
是不是等到第二天就好了?
要看是哪种限制。按时间窗口的限速通常等一小段就会恢复;按周期结算的额度用尽,得等重置周期到点才行,具体口径每个平台不一样,最好到站内对应厂商或平台页面核对当时的说明,别凭感觉安排上线时间。