限流发生时,先停止继续发起调用,把已经落盘的结果视为当前唯一可信版本,再决定是补采、去重还是重跑。关键动作是:让脚本在收到限流信号后立即转入“只写不读”的收尾模式,把内存里尚未写入的条目刷到磁盘,并记录断点位置。这样做的结果是,你保住了已消耗配额换来的数据,下一次运行可以从断点继续,而不是从零开始。
限流可能来自工具服务端、你本机脚本的并发控制,或中间代理。三种来源的保护动作不同。服务端限流通常返回明确的错误码或等待提示;本机限流往往表现为请求排队变慢;代理层限流则可能直接断开连接。
假设一个脚本一次拉取500条关键词数据,在第320条时被限流。如果脚本没有落盘,这320条会随进程结束消失;如果每50条写一次文件,最多损失50条。这个数字只用于说明落盘频率与损失量的关系,不是任何工具的实际表现。
限流后最容易被忽略的是:多个角色对“已有结果”的理解不一致。写脚本的人认为内存里的算数,做分析的人只认最终导出文件,审核的人要求能看到每条数据的来源和时间。把分歧转成可核对的项目,需要为每批结果建立一份清单。
这份清单的作用是让下一次运行有明确的起点。如果清单显示断点在“第320条之后”,补采脚本就只请求第321条起的数据;如果清单缺失,补采只能靠猜测,容易重复消耗配额。
不是所有限流都需要重跑。判断依据是:已获取的数据是否覆盖了你当前决策所需的最小集合。如果最小集合已经完整,补采只是锦上添花;如果最小集合本身被截断,重跑或换时间窗口更稳妥。
一个可操作的判断动作是:随机抽取已落盘结果中的若干条,检查字段是否齐全。如果缺失率低且集中在尾部,补采即可;如果缺失分散在中间,说明写入过程本身有问题,重跑更可靠。
限流解除后不要立刻恢复原并发。先用一个很小的批量请求验证服务端是否恢复正常,同时确认脚本的断点读取逻辑正确。这个动作的结果会直接影响下一步:如果小批量成功且数据能正确追加,再逐步提高并发;如果小批量仍然失败,说明限流未真正解除,继续等待比反复重试更省配额。
验证时把返回结果与清单中的断点位置对照。如果返回的第一条恰好是断点后的第一条,说明补采逻辑正确;如果返回了断点之前的数据,说明请求参数或游标设置有问题,需要先修正再继续。
限流保护不能只靠人工在出事时操作。脚本需要在正常退出、异常退出和收到中断信号三条路径上都执行落盘。具体做法是:把写文件的操作放在每次请求成功之后,而不是全部请求结束之后;同时用一个状态文件记录最后成功的位置。
这样即使进程被强制结束,下一次启动也能读取状态文件,知道从哪里继续。状态文件本身要定期备份,避免它自己损坏后导致断点信息丢失。这个动作的结果是,限流从“可能丢失一批数据”变成“最多丢失一个写入周期内的数据”,后续的补采或重跑决策也有了可靠依据。