先保住已经拿到的结果,再判断限流属于哪一种:如果是单位时间请求过多,临时降速通常足够;如果接口返回结构已经变化或账号权限被收回,继续重试只会消耗时间,应改写调用方式或退出这条通道。判断依据不是“有没有报错”,而是同一批任务里失败是否集中在特定时间段、特定账号或特定返回字段。
限流发生时最危险的动作是让脚本继续循环并把失败当成空结果写回。正确顺序是:立即停止写入目标表,把本次运行已成功返回的原始响应另存为带时间戳的文件,同时记录每个任务的请求参数和响应状态。这样做的结果是,你手上有一份可复核的中间快照,后续无论降速重试还是换调用方式,都能和这份快照对比,而不是从零重跑。
落盘时要保留三类信息:请求标识、返回时间、原始返回体。只存解析后的字段不够,因为限流期间部分返回可能带截断或降级内容,原始体才能帮你判断结果是完整结果还是残缺结果。如果工具侧只提供汇总报表而不给原始响应,那这份结果只能用于观察趋势,不宜直接用于对外的业务决策。
特征是同批任务在短时间内集中失败,间隔一段时间后同样的调用又能成功。这时选择保留结果并降速重试成立:把并发数降到原来的几分之一,在请求之间加入固定或递增等待,先小批量验证再放量。适用前提是接口返回的错误信息明确指向频率,且失败任务重放后能拿到与快照一致的结构。
反过来,如果降速后失败率没有明显下降,说明问题不在频率,继续等待只是拖延。此时应转向改写或退出,而不是把等待时间越调越长。
特征是请求能通,但解析层报错,或某些字段由有值变为空、由数字变为文本。这种情况下保留已有结果仍然有价值,但改写调用逻辑优先:先按新返回结构写一个只读的解析分支,用快照数据回放验证,确认新结构能稳定解析后再替换旧逻辑。不要在原脚本上边跑边改,否则新旧结果混在一起,事后无法区分哪批数据来自哪种结构。
适用前提是你还能拿到完整返回体。如果返回体本身被裁剪,改写也拿不到所需字段,就应退出这条通道,改用其他数据来源或改为人工补充。
特征是所有请求统一失败,与频率和返回结构无关。这时保留结果的意义是保住历史数据,但重试没有意义,应先核对账号状态和授权范围,确认是临时失效还是权限被调整。具体工具的状态说明和授权入口需要以该工具当前提供的官方信息为准,不要凭记忆推断。
假设某脚本每轮发起 200 次调用,其中 40 次返回频率错误,160 次成功。若直接重跑全部 200 次,可能让失败面扩大;若只重跑 40 次失败任务并降速,能较快判断限流是否为暂时性。假设降速后这 40 次里有 35 次成功,说明频率是主因,可以保留结果并继续小批量补跑;假设仍只有 5 次成功,则应停止补跑,检查返回结构和账号状态,再决定改写还是退出。这里的数字只用于说明比较方法,不代表任何工具的实际表现。
退出不等于放弃数据。当通道持续不可用、改写成本高于替代方案,或已有结果已能满足当前决策需要时,停止调用并把快照整理成可读的交付物,比继续消耗调用额度更合理。退出的前提是你能说明为什么停:是频率不可控、结构不可解析,还是权限不可恢复。把这个原因写进运行记录,下次换工具或换通道时才有依据。
无论选保留、改写还是退出,都应在动作完成后回看一次快照与最终结果的差异,确认失败任务没有被静默丢弃,再进入下一轮任务。