限流发生时,最该保护的不是还没拿到的数据,而是已经拿到的部分:先把当前批次的结果落盘成不可覆盖的本地文件,再决定是否重试或换调用方式。只要这一步没做,后续任何调整都可能把已有结果冲掉。
同样表现为报错或空返回,原因可能完全不同。调用方一侧的并发上限、工具服务端的配额、网络出口的频次控制,都会触发限流。区分方法很直接:把并发降到1、间隔拉长到明显高于平时,如果仍失败,通常不是本地并发问题;如果降速后恢复,说明问题在调用节奏。
这一步的意义在于决定保护策略。若是节奏问题,已有结果可以继续用,只需暂停新增请求;若是配额耗尽,当天可能无法恢复,必须把已有结果完整保存并标注覆盖范围。两种情况下,先落盘都是对的,但后续动作不同。
不要只保存一份汇总表。按批次写入独立文件,文件名包含调用参数和起始位置,例如 batch-2024-keywordA-offset200.json。每条记录保留原始返回字段,不要在这一步做去重或字段裁剪,否则后续无法判断哪些是缺失、哪些是被处理掉的。
同时写一个状态文件,记录已成功覆盖的范围、最后一条成功记录的标识、失败发生的时间点。这个状态文件是下一步的起点,没有它,重试时只能凭记忆猜测从哪里继续,很容易重复调用或漏掉区间。
假设一个场景:脚本按每批100条调用,跑到第7批时开始返回限流错误。此时前6批的600条已经可用,第7批可能只写入了一部分。正确做法是保留前6批、把第7批标记为不完整并丢弃,从第7批起点重新调用。这样损失最多是一批,而不是全部结果。
很多脚本的习惯是全部跑完再写文件,限流一来就什么都留不下。改成每批成功即写一次,代价是文件变多,收益是任何中断点都有可用结果。如果调用量很大,可以每批写临时文件,全部完成后合并,但临时文件不要删除,直到确认合并结果无误。
这个动作直接影响下一步:有了增量文件,你可以只重跑失败区间,而不是重跑整个任务。重跑范围越小,再次触发限流的概率越低,整个任务越容易在有限配额内完成。
如果确认限流来自调用节奏,恢复后应降低并发或加大间隔,再观察是否稳定。稳定运行若干批之后,再考虑是否逐步恢复原参数。若限流来自配额耗尽,则需要把任务拆到不同时间段,或减少单次调用量,具体额度需要核对所用工具的当前说明,不同工具差异很大。
需要提醒的是,请求量下降或某段时间没有新结果,并不能单独证明限流已解除,也可能是脚本提前退出或返回了空数据。要结合状态文件和最小试探请求一起判断,再决定是否继续扩大调用规模。