限流发生后,最该做的不是马上重试,而是先把已经拿到的结果落盘、标记来源与时间,再决定哪些任务值得继续。重试只应针对未完成且仍有价值的部分,否则一次限流可能连带毁掉此前几小时的可用数据。
常见矛盾是:脚本报错前明明已经处理了大半任务,可最终产出却比预期少很多。这通常有两种解释。
两种解释指向的动作完全不同。前者要改的是写入时机,后者要改的是重跑逻辑。判断错了,改完仍然会丢数据。
不需要复现限流,也能从现有痕迹判断。
.tmp、.bak 或按时间戳命名的中间文件,说明脚本原本有分段落盘机制,只是最终合并步骤失败。这三条证据互相印证。若文件被清空且日志编号接近中断点,基本可判定为覆盖问题;若文件未变且编号远早于中断点,则是内存丢失问题。
确认原因后,第一步动作是把当前能救回的结果固定下来,而不是立刻改脚本重跑。
具体做法:把现有输出文件复制一份,按日期和批次命名,例如 result_20240115_batch1.json,并单独记录本次运行的时间范围、已处理条数和中断位置。这个动作的结果是:即使后续重跑失败,你仍有一份可核对、可继续利用的中间成果。下一步才是在副本基础上设计增量续跑,而不是从零开始。
如果发现结果已被覆盖,先检查是否有系统级快照、备份目录或日志中残留的原始返回。能找到就恢复到独立文件,找不到就接受损失,把剩余未处理部分列为新任务,避免在旧数据上反复重试。
限流本身说明单位时间内请求过多。与其等它恢复后一次性跑完,不如把任务切成小批,每批完成后立即写盘并记录批次状态。
假设一个脚本需要处理 500 条记录,限流在第 180 条触发。若采用每 50 条落盘一次的策略,中断时磁盘上至少有 150 条完整结果,剩余 350 条可在下次运行时从第 151 条继续。这里的关键不是数字本身,而是让每次写入都成为可独立使用的成果,而不是依赖最后一次总写入。
续跑时还要注意:只重试未完成部分,已完成部分直接读取本地文件,不再请求接口。这样既减少触发限流的概率,也避免重复请求覆盖已有结果。
如果脚本调用的是即将停用或已变更的旧系统、旧接口,限流可能只是退出过程中的一个信号。此时要区分两类结果:
判断标准是:脱离原系统后,这份结果还能不能被理解和使用。能,就按批次归档;不能,就只保留说明性记录,避免占用存储却无法解读。具体哪些字段属于哪一类,需要结合你实际使用的工具和接口文档核对,不同工具的返回结构差异较大。
限流不是终点,它只是提醒你:结果的所有权应该落在你的磁盘上,而不是某次脚本运行的进程里。