你可能遇到过这种情况:日志里明明写着额度超限或频率超出,接口却照样返回结果,过一阵又突然大面积失败。这篇不猜原因,直接给一条从看响应头、看错误体到分组重试的排查顺序,顺带讲清什么时候该换计费方式、什么时候该换接入渠道,以及哪些判断在自建服务上不成立。
日志里明明写着额度超限或频率超出,接口却照样返回结果,过一阵又突然大面积失败——这不是玄学,多半是你同时踩到了软限制和硬限制两条线。这篇不猜平台内部怎么实现,直接给一条从看响应头、看错误体到分组重试的排查顺序,顺带讲清什么时候该换计费方式、什么时候该换接入渠道,以及哪些判断在自建服务上根本不成立。
先说结论:能调通不代表没问题,只代表你还没撞到硬拦截。真正要判断的是「这次报错属于哪一类限制」,不同类别的处理动作差别很大,混着处理只会把软限制拖成硬限制,把偶发报错拖成整批失败。
超限报错却还能用,常见是哪几种情况
平台侧通常同时存在提示性拒绝和真正的硬拦截。前者只是告诉你「接近阈值了」,请求会被放行或稍后放行;后者要等结算周期切换、或者瞬时并发越过更高一档才会真正拒绝。你看到的那条报错,很可能只是前者。
- 软限制与硬限制并存:先给提示性拒绝,真正的拦截要等结算周期或阈值再上一档
- 多通道或多 Key 分流:单个 Key 打满,请求被自动分到其他通道继续跑
- 限流按短窗口统计:你看到的报错是瞬时峰值触发的,请求排队后被放行
- 缓存命中或幂等返回:请求根本没走到模型侧,自然不计入额度
还有一种容易被忽略的情况:你调用的中转层自己做了失败重试,第一次请求因限流被拒,它换了个上游再打一次成功了,但错误日志把第一次的失败原样记了下来。看起来是「超限还能用」,实际上是重试掩盖了真实状态。
排查顺序:先确认它到底算不算故障
别急着改代码,先按固定顺序把现场确认清楚。下面四步做完,基本能判断这是可自愈的瞬时问题,还是需要动配置的真实故障。
- 看状态码与错误体把响应里的错误类型字段挑出来,区分额度不足、频率超限、并发超限。三者的重试策略完全不同,频率超限可以退避重试,额度不足重试多少次都没用。
- 看响应头里的额度信息记录剩余额度、重置时间、重试建议这类字段,和自己的时间戳对一遍。如果剩余额度显示还有,报错却一直在,说明问题在并发或链路,不在额度。
- 做一次小流量对照同一个 Key 串行发几条请求,观察报错是否复现。串行不复现、并发必现,基本可以锁定是并发叠加触发的短窗口限流。
- 量延迟基线到 /tools/speed-test 测一下接口延迟基线,判断失败是限流,还是链路超时被上游包装成了限流错误。
怎么规避:把「偶尔可用」改成「可预期」
目标不是让每次请求都成功,而是让失败可预测、可恢复。核心思路是把「等到报错再处理」改成「提前排队、主动退避」。按额度分档做排队加指数退避,同时对同时刻在跑的并发数设上限,而不是只看一天的总量。
| 现象 | 更可能的类别 | 优先动作 |
|---|---|---|
| 串行正常、并发报错 | 短窗口频率/并发超限 | 压并发上限,加指数退避 |
| 一直报错、响应里额度显示不足 | 额度不足 | 换计费方式或分流到其他通道 |
| 延迟很高且零星失败 | 链路超时伪装成限流 | 降低超时阈值,加降级路径 |
| 换 Key 后立刻恢复 | 单 Key 打满 | 按 Key 分池,做轮换 |
| 清空缓存后报错消失 | 缓存/幂等掩盖 | 确认请求是否真走到模型侧 |
每条调用链最好留一条降级路径:换模型、换通道、或者直接返回缓存结果。降级不是丢人,是让上层的用户体验不至于跟着额度一起崩。额度剩余和重置时间要做成监控项,写死阈值没意义,到 /price-watch 看当时的额度和重置节奏,再定自己的告警线。
请求也要分组成批,控制同一时刻在跑的并发数。很多人只盯着总量,以为总量没超就安全,结果一起跑的瞬间就把短窗口打满。批处理加队列,是最省事的做法。
怎么选:什么时候换计费方式,什么时候换渠道
用量波动大、峰值集中的场景,按量计费配合多通道更稳,峰值被摊开后不容易撞线;用量平稳且长期跑满的场景,再去看包月套餐划不划算。判断依据不是感觉,是过去一段时间的实际曲线。
选渠道时先比限制口径,而不是只比单价。延迟怎么算、并发怎么算、超额了是拒绝还是排队,这些口径直接决定你的代码怎么写。具体数字到 /sites 和各家的官方 API 价格页核对当时的情况,别拿别人截图里的数字当依据。中转站的可信度和稳定性排期可以看 /rankings 的当期结果,同样只做参考。
有一类情况这套判断不适用:自建或自托管服务没有共享额度池,超限基本等于真实并发打满,应该去查排队长度和资源占用,而不是找「软限制」。另外,同一份代码要跨多个供应商时,建议把兼容协议锁定在一层,别把限流处理写死在某个 SDK 里,否则换渠道等于重写。
下一步先按上面四步确认报错类别,再决定是调并发还是换计费方式;想看各家当前的限制口径和价格,到站内对照当时的数字。→常见问题
报错说超限,但请求一直有结果,要不要当作没事?
不能当没事。软限制阶段能用,说明你正踩在阈值边缘,一旦并发上来就会整批失败。建议立刻加监控记录剩余额度和重置时间,并提前做退避与降级,别等到线上报错才处理。
同一套代码,本地能跑线上报超限,问题出在哪?
多数是并发口径不同,本地串行、线上并行,瞬时峰值把短窗口打满。先把并发数压到个位数复测,再看响应头里的剩余额度是否对得上,确认后再调并发和重试策略。
换渠道能解决超限吗?
只在限流来自单一通道时才有效。如果超限来自你的账号总额度或模型本身的容量,换渠道只是把问题挪个位置。换之前先确认报错字段指向哪一层,再决定换站还是换计费方式。