先给结论:限流发生时,最该保护的不是“继续跑完”,而是把已经拿到的结果完整落盘、标记边界,再决定是等待、降速还是切换入口。假设情境:你用 seotrad 软件的脚本批量调用某个查询接口,跑到第 300 条左右开始出现超时和拒绝响应,但前 300 条已经写入内存、尚未保存。此时如果直接重试整批,可能把旧结果覆盖成空值;正确动作是立即停止发起新请求,先把已有结果写入独立文件,再核对限流边界,最后才考虑续跑。
限流通常表现为请求被拒或延迟,而不是数据被删除。真正的风险来自脚本的重试逻辑:很多批量脚本在失败后会重新初始化结果对象,从第一条重新请求。如果此时旧结果只存在内存里,而新循环没有做增量合并,就会用不完整的新结果覆盖完整旧结果。更隐蔽的情况是脚本把失败响应写成空占位,后续导出时看起来“每条都有记录”,实际有效字段已经丢失。
判断属于哪种情况,可以用可核对的证据区分:
这些现象都只能说明相关,不能单独证明原因。请求量突然归零也可能是网络中断、凭证过期或目标入口变更,需要分别排查,而不是直接当成限流处理。
假设你确认前 300 条有效、第 301 条起被拒,可以按下面的顺序处理,每一步的结果都会影响下一步:
其中第 2 步是分水岭:如果只做到停止而不落盘,进程一旦退出,已有结果就没了;如果先落盘再排查,最坏情况也只是这次没跑完,而不是这次白跑。
三种处理方式成立的前提不同,选错会浪费时间或触发更严格的限制:
这里没有通用的等待时长或并发数值,具体限制需要核对所用工具和接口的说明。把等待时间设得过长会拖慢交付,设得过短则可能反复触发拒绝。
第一是断点标识是否稳定。如果脚本按行号续跑,而源数据顺序会变化,断点就会错位;按唯一键续跑更可靠。第二是新旧结果的字段口径是否一致。假设旧快照里有 12 个字段,新入口只返回 9 个,直接合并会让部分记录字段缺失,后续分析得出的结论也会偏差。
核对方式可以很轻:抽取几条已成功记录,用同一标识在新入口重查一次,逐字段比对。如果字段一致,续跑合并;如果不一致,先保留两份独立快照,等确认口径后再决定是否统一。这个动作的结果直接决定你最终交付的是一份完整数据,还是两份需要解释来源的拼接数据。
限流本身不是灾难,真正的损失是结果被覆盖或断点丢失。先把已有结果落盘并标记边界,再根据探测结果选择等待、降速或切换入口,才能让下一次续跑建立在可靠的基础上。