限流发生时,最该保护的不是“继续跑完”,而是已经拿到的可复用结果和断点位置。先停掉重试,把已完成部分落盘并标记边界,再判断限流是账号级、接口级还是调用频率触发,最后决定换时段、降并发还是拆任务。这样即使当次调用被迫中断,下一次也不必从零开始。
同样表现为“调用失败”,原因可能完全不同。账号级限流通常伴随整批任务同时失败,换接口也无效;接口级限流往往只影响某一个查询动作,其他动作仍可返回;频率触发则表现为前几条正常、后面连续报错。判断方法很直接:用一条最小请求单独测试,如果单条也失败,优先怀疑账号或接口状态;如果单条成功、批量失败,更可能是频率或并发设置问题。这个区分决定了下一步是等待、拆分还是更换调用方式。
不要只依赖内存里的列表。每完成一批就写入一个带序号的结果文件,同时记录三个字段:已处理到哪条输入、该批成功返回了哪些记录、失败项的错误类型。这样做的实际动作是让“进度”和“结果”分离保存。假设一次任务有若干批,前几批已成功、后几批被限流,那么断点文件应能让你只重跑失败批次,而不是重跑全部。结果如何影响下一步:如果断点文件里失败项集中在一个接口,就优先调整该接口的调用节奏;如果失败项分散,则更可能是整体频率过高。
更稳妥的动作是:先记录失败时间点,暂停调用,保留当前结果文件,再单独测试一条请求确认是否恢复。这个测试结果决定你是继续等待,还是进入拆分方案。
当限流反复出现,把任务按输入范围或查询类型拆成更小单元,往往比反复试探上限更有效。具体做法是:把待处理清单按固定数量分成若干组,每组单独运行并单独落盘。这样某组被限流时,其他组的结果仍然可用。需要说明的是,分组数量没有通用最优值,它取决于你实际观察到的失败节奏;如果失败总在第若干条之后出现,就应把组容量设在这个边界以内。适用条件是你能接受更长的总耗时,换取中断时的可恢复性。
假设某次脚本任务需要处理一批查询,前两组正常返回,第三组开始连续报错。此时正确顺序是:停止第三组,保存前两组结果,记录第三组输入范围和错误信息;然后用一条单独请求测试是否恢复。如果单条成功,就把第三组再拆成更小批次重跑;如果单条仍失败,就等待并核对账号或接口状态。这个例子的数字仅用于说明比较方法,不代表任何工具的真实额度。关键结论是:限流下的优先目标是保留可复用结果,而不是证明调用还能继续。
限流解除后,不要直接把新结果覆盖旧文件。先比较失败批次重跑后的记录数量、字段完整性和重复项,再合并。若发现同一输入出现两条不同结果,应保留时间较新且字段完整的那条,并标记差异来源。这样做的结果是:下一次遇到限流时,你能明确知道哪些结果是可信的、哪些需要复核,而不是把一次中断变成整批数据不可用。