限流发生时,第一件该做的事不是重试,而是把已经拿到的结果落盘并标记为不完整。因为限流只说明请求配额被拒,并不说明前面采集的数据无效;如果因为后续失败而丢弃整批结果,等于把可用的部分也一起损失了。
脚本调用页面速度优化工具通常分三段:发起测量、等待测量完成、拉取报告。限流可能只打断其中一段,保护策略完全不同。
判断依据不是报错文本,而是你的脚本在发请求前是否已经拿到可持久化的任务标识。拿不到标识的那一段,才是真正需要重跑的部分。
假设一个批量脚本要测 200 个 URL,跑到第 60 个时接口返回限流。此时本地已有 59 份结果,第 60 个任务已提交但报告未取回。
这个顺序的关键在于:结果文件和待办文件分开。合并存放会导致一次失败的写入污染整批数据,也让后续无法判断哪些是已确认完成、哪些只是提交过。
限流不是唯一解释。同样表现为请求失败的情况还有:认证过期、请求体过大、目标地址不可达、脚本自身超时。用可核对的证据区分,才能决定要不要保护性暂停。
如果失败请求数突然归零,也不能直接判定限流已解除。可能是脚本提前退出、队列已空、或错误被上层逻辑吞掉。需要同时核对已处理数量和预期数量是否一致,再决定下一步动作。
结果文件建议按“一次测量一份记录”的方式追加写入,每条记录包含目标地址、测量时间、原始指标和脚本版本。不要只在全部跑完后统一写一个大文件,那样中途中断会丢掉全部内容。
恢复时按目标地址去重,而不是按行号续跑。行号会因失败重试而错位,地址去重则能保证同一个 URL 不会因为重试产生两份互相矛盾的记录。如果确实需要保留多次测量,就在记录里加批次字段,让后续分析能选择用哪一批。
限流解除不等于配额充足。恢复后的第一个动作应该是只跑少量任务,观察是否再次被拒,再逐步提高并发或缩短间隔。这个动作的结果直接决定下一步:如果小批量稳定通过,可以恢复原速率;如果很快再次被拒,说明当前配额低于原设定,需要下调并发并把批次拆得更小。
同时要接受一个现实:被限流打断的批次,其完成时间已经不可控。与其追求一次跑完,不如让脚本支持断点续跑,把每次运行都当作可以安全中断的单元。这样即使再次遇到限流,损失也只限于当前正在处理的那一条,而不是整批结果。