先给结论:如果限流是短时的、结果还能从工具侧重新取回,优先保“已落地的结果”而不是继续硬跑脚本;如果限流会持续到任务窗口结束、且已有结果无法回补,则应立刻停止新增请求,把已有结果冻结成可交付版本。判断依据不是限流提示本身,而是已取回数据能否二次获取和剩余时间窗是否够恢复这两个条件。
脚本调用优化排名软件时,限流打断的往往不是“全部数据”,而是某一段进度。此时已有结果分两类:一类是已经写入本地或中间存储的原始响应,另一类是尚未落盘、只存在于脚本内存里的临时数据。限流发生时,第一类通常安全,第二类会随进程退出而消失。
因此保护动作的第一步不是重试,而是立即停止写入覆盖。很多脚本默认用最新一次响应覆盖同名结果文件,限流后返回的空值或错误页一旦写入,会把之前正常的结果一起冲掉。实际动作:把当前结果目录改为只读,或先整体复制一份带时间标记的快照,再决定是否继续。这个动作的结果是——即使后续重试全部失败,你手里仍有一份可核对的完整版本,下一步才有比较基础。
面对限流,常见两种反应:原地退避重试和切换调用通道(换接口、换账号、换代理或改走导出功能)。两者都成立,但代价不同。
如果已有结果已经覆盖大部分关键项,原地退避更划算;如果关键项恰好卡在限流段、且时间窗不足以逐个重试,切换通道更现实。这里有一个反例会让上述结论失效:当限流伴随登录态失效或权限变更时,退避重试和切换通道都可能拿到“看似成功但内容为空”的响应。这种空响应不是限流恢复的信号,而是权限问题的表现。此时继续按限流处理,会把空结果当成有效数据写入,破坏已有结果。识别方法是抽查几条已成功记录与当前响应做字段比对,若关键字段整体缺失,应转向核验权限与登录状态,而不是继续调重试参数。
限流期间冻结结果,不只是复制文件。为了让后续能判断“这份结果是否还能用”,至少保留:调用时间、请求参数、返回状态、原始响应体,以及本次任务的目标范围。缺少目标范围时,你无法判断当前结果是“完整”还是“被限流截断的部分”。
假设一个短例子:某次任务计划取 100 个对象的排名数据,限流发生在第 60 个之后。若只保存了 60 条记录,没有保存计划总数,后续很容易把这 60 条当成全部结果交付。若保存了计划范围,就能明确标注“已完成 60/100,剩余部分因限流未取回”,交付时不会误导。这个例子只用于说明字段保留的比较方法,不代表任何真实任务规模。
限流缓解后,不要直接全量重跑。先用与冻结结果相同的一小段参数发起少量请求,核对返回字段、状态和数值口径是否与冻结版本一致。验证通过,再决定是增量补齐还是整体重取;验证不通过,说明工具侧口径或权限已变,此时应以冻结版本为准,而不是用新结果覆盖。
这个动作的结果会直接影响下一步:口径一致就做增量补齐,只补限流截断的部分;口径不一致就保留冻结版本并单独标注差异,避免把两种口径的数据混在一起比较。对具体工具的重试间隔、并发上限和恢复策略,不同产品差异较大,实际参数需要以你所用工具的当前说明为准。
最后一步是把这次限流事件记录成一条可复用的判断规则:什么条件下退避、什么条件下切换通道、什么条件下直接冻结交付。记录规则比记录单次报错更有用,因为下次限流时你不需要重新从零判断,而是直接套用已经验证过的取舍条件。