限流发生时,最危险的动作不是等待,而是立刻重试并覆盖输出。已有结果是否值得保留,取决于它是否已经通过校验、是否可被独立复现,以及限流是暂时配额问题还是调用方式本身触发了拒绝。先冻结当前结果,再决定保留、改写或退出,比反复重跑更可控。
脚本被限流时,输出目录里往往混着三类内容:完整返回、截断响应和空占位。把这三类分开标记,才能决定后续动作。一个可核对的证据是每条记录是否带有结束标记、状态码和请求参数摘要。如果只有部分记录具备这些字段,就不应当把整个结果集当成已完成。
假设一次批量查询返回了 200 条记录,其中 40 条缺少结束标记,另外 160 条字段完整。此时合理动作是先把 160 条写入只读快照,再为 40 条生成待补清单。这样做的结果是,后续无论换不换调用方式,都不会把已完整的 160 条重新覆盖成未知状态。若不做这一步,重跑脚本时一旦再次限流,完整结果也可能被截断输出替换。
保留不是无条件冻结,而是先确认结果仍然对应目标对象。需要核对的前提包括:请求参数是否与当前任务一致、返回时间是否落在可接受窗口内、字段结构是否与下游消费方式兼容。三项都满足时,保留原结果并单独处理缺失部分,通常比整体重跑更稳。
如果其中一项不满足,保留就只是把问题推迟。例如参数已经变化,却继续保留旧结果,后续合并时会出现同一对象两个版本,反而增加核对成本。
限流常被误认为“请求太多”,但实际触发原因可能是并发过高、单位时间请求过密、单次返回过大或缺少退避。改写方式的目标不是绕过限制,而是让补数过程可中断、可续跑。一个实际动作是把补数拆成小批次,每批完成后写入独立文件,并在批次之间加入等待。这样做的结果是,即使下一批再次被限流,前一批成果仍然可用,下一步只需要从待补清单继续。
如果工具本身提供重试提示或等待时间字段,应优先按该提示安排下一次调用;如果没有,就按固定间隔逐步拉长等待,而不是密集重试。需要说明的是,具体工具的配额、退避规则和当前入口需要以该工具当时的说明为准,不能凭旧教程推断。
当已有结果无法证明完整性,且下游要求全量一致时,退出重跑可能比修补更省事。适用前提是:数据量可控、重跑窗口允许、调用方式已经调整到不易再次触发限流。反之,如果重跑成本高、限流原因未明,继续重跑只会重复消耗配额。
可以用一个短例子比较:假设完整重跑需要一次调用 200 条,而补数只需要调用 40 条。若限流由单次返回过大触发,补数反而更容易成功;若限流由总配额耗尽触发,补数和重跑都会失败,此时应先等待配额恢复,而不是继续改写脚本。这个例子只用于说明判断方法,不代表任何具体工具的额度。
无论选择保留、改写还是退出,都建议记录三件事:触发限流时的请求参数、已保存结果的校验状态、下一次调用的计划。这样做的结果是,后续出现“结果不一致”时,可以区分是限流截断、参数变化还是合并顺序造成的,而不是把所有异常都归因于工具本身。
若同一批数据在不同时间得到不同结果,先不要断言某一方错误。更合理的做法是对齐请求参数和取数时间,再比较差异字段。只有排除了截断和参数漂移,才进入工具能力或数据源变化的判断。