先给结论:限流发生时最该保护的不是“继续跑完”,而是“已经跑完且尚未落盘的那部分”。如果你的脚本把结果攒在内存里、等全部任务结束再统一写入,限流会连同已完成的数据一起丢掉。可行的做法是改成边跑边落盘、断点可续,并在限流信号出现时主动停止而非反复重试。下面用一个假设情境把决策过程走一遍。
假设你正在用脚本调用百度SEO助手这类查询工具,把一批旧内容的历史表现数据导出,用于决定哪些页面保留、哪些下线。任务量假设为两千条,脚本按顺序请求,每成功一条就把结果追加到本地文件。跑到大约六百条时,接口开始返回限流类错误,后续请求全部失败。
此时有两种处理方向,成立条件不同:
两种方向都成立的前提是:结果已经写入磁盘,而不是还在内存里。
不同原因对应不同动作,不能一律重试:
一个实际动作:在脚本里把“限流类错误”和“其他错误”分开计数。限流错误连续出现超过你设定的阈值(比如连续5次),就触发停止并写入断点文件。这个动作的结果是:你保住了已完成部分,同时留下了一条可判断的记录,而不是让脚本在失败循环里空转。
把“先收集、后写入”改成“逐条追加”,是这类场景里最直接的保护手段。具体可以这样做:
这样即使限流突然发生,损失上限也只是当前这一条,而不是整批。
退避重试不是无限等。建议给每个任务设置最大重试次数,并在重试之间加入递增间隔。需要注意:具体等待多久、服务端是否提供建议等待时间,取决于你实际使用的工具和当时的返回信息,这些需要以你看到的真实响应为准,不能照搬固定数值。
如果重试达到上限仍未成功,就把它记入“待处理”清单,连同错误类型一起保存。下一步动作是:先完成剩余未处理任务中能成功的部分,最后再集中评估这份待处理清单——是继续等待、换时间重跑,还是接受这部分数据缺失。这个顺序能让你在限流反复出现时仍然拿到尽可能完整的结果。
回到旧内容退出的场景:你真正需要的是“哪些页面还有价值”这个判断,而不是两千条原始数据的完整副本。所以限流中断后,可以先用已拿到的约六百条做初步判断,把明显无价值的先标记出来。剩下的部分等限流恢复后补齐再复核。
关键是把两类记录分开:一类是“已确认结果”,一类是“因限流未获取”。不要因为后一类缺失就推翻前一类,也不要拿未获取的部分当作“没有价值”的证据——请求失败和结果为空是两回事。分清这一点,限流造成的缺口才不会污染你的最终决策。