批量任务开了 50 个并发,两分钟内全部返回 429 rate_limit_exceeded,账号配额是 500 RPM。乍看像缓存或者权限的锅,追下去往往不是。
python -c "print(500/60)" curl -i https://api.example.com/v1/chat -d @req.json | head -1
追下去是这么回事:并发数按机器核数设的,没有换算成每分钟请求数。50 个并发每个请求 1.5 秒,一分钟就是 2000 次,远超配额。
碰到「并发打满配额」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
具体做法是,用令牌桶把并发压到配额以内;批量任务改成分批 批间留间隔;429 时读 Retry-After 再发;把实际 RPM 打到监控上。
验收就看一点,批量任务跑完 429 次数为 0 实际 RPM 不超过 500。
