遇到限流时,先别急着重跑脚本。已有结果是否值得保留,取决于它是否已经落盘、能否区分完整与不完整记录、以及限流是临时性的还是结构性的。一个可操作的原则是:先把已取回的数据冻结成只读快照,再决定续跑、改写还是退出。这样即使后续调用全部失败,你手里仍有一份可核对、可交付的中间成果,而不是零。
限流可能来自接口调用频率、账号并发数、单次返回条数上限,或平台对异常流量的临时拦截。不同层级的限流,对已有结果的影响完全不同。如果限流发生在分页中途,那么已经取回的页面通常是完整的,缺的只是后续页;如果限流发生在单条记录内部(例如一次请求要拿详情和指标两个子资源),那么这条记录可能是半成品,直接混入结果集会污染整体。
判断方法很简单:检查每条记录是否带有可识别的完成标记,比如是否包含预期的全部字段、是否有稳定的唯一标识、时间戳是否落在同一批次窗口内。缺少完成标记的记录应单独隔离,不要与完整记录合并。这一步不需要额外调用工具,只需要在本地对已落盘数据做一次字段完整性检查。
保留适用于限流为临时性、且已有结果已覆盖核心维度的情况。例如脚本目标是拉取近30天数据,限流发生在第25天,前24天已完整落盘。此时把快照标记为“截至第24天”,注明缺失区间,就能支撑大部分分析,不必等待重跑。
改写适用于限流由请求方式触发、且业务目标可以降级满足的情况。比如把高频逐条调用改为按天批量拉取,或把实时刷新改为定时增量。改写的代价是数据粒度变粗,收益是降低触发限流的概率。前提是你确认业务方接受更粗的粒度,否则改写只是把问题推迟。
退出适用于限流反复出现、且已有结果无法支撑任何决策的情况。如果每次续跑都在同一位置被拦截,说明当前调用方式与平台约束不匹配,继续投入时间不会改变结果。此时应停止脚本,保留日志和快照,转人工核对或改用平台提供的导出路径。
多个角色对“结果是否可用”常有不同理解:执行者认为数据已经够用,分析者认为缺了关键区间,管理者只关心能否按时交付。分歧的根源往往不是数据本身,而是没人说清“完整”的定义。把分歧转成可核对的项目,需要三个字段:快照时间、覆盖区间、已知缺口。
假设一个场景:脚本负责拉取某渠道的每日消耗与点击,限流在第10天触发。执行者保存了前9天数据,分析者发现第9天只有消耗没有点击。此时不应争论“能不能用”,而应把记录写成:快照截至第9天,消耗完整,点击缺失第9天。这样任何角色都能独立判断这份结果是否满足自己的用途,后续续跑也有明确的起点。
具体动作:在脚本中增加一个“落盘即冻结”步骤——每成功取回一批数据,立即写入独立文件并附带批次元信息(请求参数、返回条数、时间戳、是否完整)。当限流异常抛出时,脚本不再自动重试全部请求,而是读取最近一个完整批次,从该批次之后继续。
这个动作的结果会直接影响下一步:如果冻结批次本身完整,续跑只需从断点开始,已有结果全部保留;如果冻结批次不完整,续跑前必须先补齐该批次,否则后续数据会与残缺批次混在一起,导致区间统计失真。换句话说,冻结动作把“限流后怎么办”从一个模糊的焦虑,变成了一个可以逐批核对的清单。
出现以上信号时,继续调参的边际收益很低。更合理的做法是保留现有快照,记录触发条件,把问题交回给能调整账号权限或数据口径的一方。限流本身不是失败,把有限的结果整理成可交接的状态,才是脚本任务真正结束的标志。