from ratelimit import limits, sleep_and_retry @sleep_and_retry @limits(calls=8, period=1) def call(img): pass
压测把并发从 10 调到 50,接口开始成片返回 429 Too Many Requests,控制台显示账号 QPS 上限 10。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:账号维度按 QPS 限流,客户端线程池没有令牌桶,一次把五十个请求全发出去。429 之后代码没读 Retry-After,直接当失败丢弃。
「识别接口限流处理」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:客户端加令牌桶 速率压到 8 QPS 留余量;读响应头 Retry-After 按提示等待;429 计入重试 用指数退避;多账号时按账号分桶 不要共用一个桶。
确认没问题再收工,压测期间不再出现 429 成功率保持在 99% 以上。
