先给一个有条件的结论:如果限流只是短时拒绝、且你手上已有可复用的中间结果,那么最该做的不是继续重试,而是立即停止新请求,把已拿到的数据落盘并冻结任务状态。这样做的理由是,限流期间继续调用往往只会消耗配额,却拿不到新结果;而已经成功返回的部分,如果只存在内存里,脚本退出或进程被杀就会一起丢失。反过来说,如果限流背后是账号或密钥被整体封禁,那么“保护已有结果”这一步无法让你恢复调用,只能保住历史数据,此时需要先确认拒绝范围再决定是否换通道。
这两种情况的处理方向完全不同,判断依据可以从返回内容里找:
只有第一种情况,保护已有结果加上等待重试才有意义。第二种情况,你要做的是保全数据、暂停任务,再排查账号或权限来源,而不是继续消耗时间。
很多脚本把结果攒在内存里,跑完才统一写文件。限流一发生,进程中断,前面几十分钟的调用全白费。改成边拿边写,情况就不一样。
一个假设的例子:脚本要处理一千条待查记录,每拿到一条就追加写入本地文件,同时记录这条记录的唯一标识和处理时间。当限流触发时,脚本捕获异常,把当前进度写入一个状态文件,然后退出。下一次启动时,脚本先读状态文件,跳过已完成的标识,从断点继续。这样即使限流反复出现,每次也只损失尚未完成的部分,而不是全部重来。
这个动作会直接影响下一步:有了断点文件,你才敢在限流解除后继续跑,而不是被迫重新开始。
有几类常见反应会让已有结果更快失效:
更稳妥的做法是:捕获限流信号后暂停,记录当前进度,等待一个合理的间隔再试探性调用一次,确认是否恢复。
为了让断点续跑真正可用,每条结果至少应保留:
缺少唯一标识时,续跑只能靠行号或顺序,一旦中间有跳过就会错位。这一点在限流恢复后的补跑阶段尤其明显。
如果限流的原因不是调用频率,而是你的请求本身触发了风控——例如短时间内查询了大量相似对象、或请求模式明显异常——那么“等待后继续”未必有效。此时即使恢复调用,也可能很快再次被拒。判断线索是:等待明显超过提示时间后,第一次试探调用仍然被拒,且返回信号与之前一致。这种情况下,需要先调整请求节奏或分批策略,而不是单纯依赖断点续跑。
下一步动作可以这样定:先做一次单条试探调用,记录返回信号;如果恢复,就带着断点文件继续;如果仍被拒,就暂停任务,转而核对账号状态与请求模式,再决定是否调整脚本节奏。