先保留已有结果,再决定是否重跑。限流只说明请求节奏触发了对方限制,不等于已抓到的排名数据失效。正确顺序是:把当前结果落盘并标记完成范围,降低并发或延长间隔后只补缺口,最后才考虑改写脚本或退出该数据源。直接重跑全部任务,既浪费配额,也会让新旧结果混在一起,后续无法判断哪批数据可信。
不同完成状态的结果,保留价值完全不同。可以先按下面的特征分档:
分档之后,动作就明确了:完整批次冻结不动;部分完成批次补缺口;可疑结果单独复核。判断依据是返回字段的完整度和缺口清单,而不是请求是否报错。
保留并补跑适合限流是偶发的情况。前提是缺口范围清楚、总量不大、数据源本身仍可用。代价是要等待,补跑期间不能把部分结果当结论。如果缺口只占少数查询对象,补跑通常比推翻重来更省事。
改写脚本适合限流反复出现、且集中在同一调用模式上的情况。常见改法包括降低并发、拉长请求间隔、把大批量拆成多轮、对失败请求做有限次退避重试。前提是你清楚哪一段触发了限制。代价是整体耗时上升,原来一次跑完的任务可能变成多轮。改写后应先用小批量验证是否还会被限流,再放开规模。
退出该数据源只在两种条件下成立:一是限流已经影响到必须完成的查询对象,且调整节奏后仍无法稳定拿到结果;二是该来源的数据对当前决策并非不可替代。代价是历史对比口径会断,换来源后新旧数据不能直接拼接比较。退出前应把已保留的结果导出存档,并记录停用原因和最后可用时间。
假设某脚本需要查询200个对象,跑到第120个时被限流。此时已有120条结果,其中前100条字段完整,后20条只有部分字段。
如果小批补跑顺利,再继续补完剩余对象;如果仍然被限流,说明问题不在单次请求量,而在调用模式本身,此时应转入改写脚本或评估退出。这个例子里的数字只用于说明比较方法,实际阈值需要按数据源表现自行确定。
请求量下降、抓取量归零或某次调用全部成功,都不能单独说明限流问题已经解决。请求量下降可能只是脚本提前退出;抓取量归零可能是任务根本没启动;一次成功可能只是恰好落在限制窗口之外。更可靠的证据是:连续多轮补跑都能稳定返回,且缺口清单在缩小。若补跑后缺口没有变化,应检查查询对象是否本身无效,而不是继续加长等待。
限流处理的核心不是“跑完”,而是让每一步结果都能被下一步使用。保留完整批次,是为了给后续对比留下基线;记录缺口清单,是为了让补跑有明确目标;隔离可疑结果,是为了避免污染判断。做完这些之后,再决定是继续补跑、改写脚本还是退出该来源,依据才是充分的。若已保留的结果足以支撑当前决策,也可以先用于判断,把补跑放到下一轮,而不是在限流当下反复重试。