限流发生时,最该保护的不是“把这一轮跑完”,而是已经拿到且尚未落盘的样本。若脚本是边请求边写入,限流只影响后续批次;若结果先堆在内存、最后统一写文件,一次中断就可能让整轮白跑。判断顺序应该是:先确认当前结果是否已经持久化,再决定是降速续跑还是立刻停止并切换策略。
限流通常表现为请求返回错误、响应变慢或返回空数据。真正危险的是第二种情况:某些脚本在拿到空响应后,仍会用空值覆盖上一轮写好的字段。判断依据是看写入逻辑——如果每轮结果都写同一个文件或同一行,且没有“仅当新值非空才更新”的条件,那么限流造成的空数据会污染已有结果。
可区分的证据有三类:
实际动作:给写入函数加一个前置判断,只有新结果通过基本校验(字段非空、长度在合理区间、格式符合预期)才允许覆盖。这个动作的直接结果是,限流期间产生的异常值不会进入结果集,下一步排查时你能分清“没拿到”和“拿到了错值”。
如果待处理样本量不大,且已有结果已经落盘,优先选择降速续跑。做法是把并发数调低、在请求之间加入固定或递增等待,并从上次成功的最后一个标识继续,而不是从头重跑。这样做的依据是:重跑会重复消耗配额,还可能再次触发限流。
假设一个脚本原本并发 10、每轮处理 500 条,中途在第 180 条被限流。此时应记录已完成的最大序号或唯一标识,把并发降到 2 至 3,并在每批之间留出间隔。这个假设只用于说明比较方法,不代表任何具体工具的推荐参数。降速后如果仍连续失败,说明限流不是短时波动,应转入条件二。
需要保留的边界:降速续跑成立的前提是结果可断点续传。如果脚本没有记录进度、无法从中间继续,那么降速也只能重跑,这时先补进度记录比继续请求更重要。
当样本量很大、限流反复出现,或已经确认部分结果被异常值覆盖时,继续在原文件上追加会让问题越滚越大。此时应先把当前结果整体复制一份冻结,标记为“含不确定数据”,然后在一个干净的新文件上重建。
重建不是简单重跑,而是分三步:
这个动作的结果是,你得到一份可追溯的结果集:哪些值来自首次请求、哪些来自重试、哪些仍缺失,都能对应到日志。下一步如果要判断限流是配额问题还是请求方式问题,这些状态记录比单纯的失败计数更有用。
个别样本能跑通,不代表规模化后仍成立。常见例外包括:单次请求成功但高频请求触发限制;同一批数据在低并发下正常、高并发下返回异常;以及工具或接口的限流规则随时间或账号状态变化。这些情况下,小样本测试的结论不能直接外推到全量任务。
因此,在规模化之前应先用一小批样本做压力试探,观察失败是否随请求频率上升而集中出现。如果失败集中在特定时间窗口或特定请求类型,说明限制与频率或类型有关,应调整请求节奏而非更换工具。如果失败随机分布、与频率无关,则更可能是单条样本或参数问题,需要逐条排查。具体工具或服务的限流规则、配额和当前功能属于会变化的信息,使用前需要核对官方说明。
无论选择降速续跑还是冻结重建,判断标准始终是同一件事:已有结果是否可信、是否可追溯。只要这两点成立,限流就只是进度问题;一旦结果被异常值污染且无法区分,继续跑下去只会让后续判断更难。