遇到限流时,先不要继续重试,而是立刻把“已经拿到的结果”和“尚未拿到的任务”分开保存:把已完成部分按原始请求参数逐条落盘,把失败任务标记为待处理,再根据限流是短时突发还是持续配额不足,分别选择退避重试或缩小任务范围。这样做的目的不是绕过限制,而是让已有结果不被后续失败覆盖,也让下一步判断有据可依。
限流通常有两种可区分的原因。第一种是短时频率触发:同一时间窗口内请求过于密集,等待一段时间后恢复。第二种是配额或权限边界:账号、令牌或套餐本身的可调用量已经用尽,继续等待也不会自动恢复。
判断依据可以看三点:错误信息里是否出现重试等待时间;同一凭证在其他任务上是否仍然可用;暂停一段时间后单次请求是否成功。如果暂停后单次成功,偏向短时频率问题;如果单次仍失败,更可能是配额或权限问题。
选择依据:短时频率问题适合退避重试;配额问题适合停止脚本、保存现场、改为分批或换时间窗口执行。两者混在一起处理,最容易把已完成结果覆盖掉。
无论哪种限流,第一步动作都一样:让写入操作先于重试发生。建议按以下顺序执行。
这个动作的结果会直接影响下一步:如果失败项能单独恢复,就只需补跑失败部分;如果连单条试探都失败,就应停止补跑,转为调整任务范围或执行时间。
条件一:结果已经足够支撑当前判断。此时优先保护结果,不再追求补齐全部数据。把已完成部分整理成可核对清单,标注覆盖范围和缺失项,先用于内部判断。缺失项留到下一个可用时间窗口再补。
条件二:结果必须完整才能判断。此时不能只保存部分结果就下结论。应把任务拆成更小的批次,每批完成后立即落盘,并在批次之间加入等待。若配额持续不足,就缩小单次任务量,而不是提高重试频率。
两种选择的共同点是:先落盘,再决定是否继续。区别在于,前者可以接受缺失,后者必须明确缺失会影响哪一步判断。
多个角色对同一事实有不同理解时,常见分歧是“结果到底算不算拿到了”。处理方式不是争论,而是把分歧拆成可核对字段:请求参数、返回状态、落盘时间、结果条数、缺失范围。
例如,假设甲认为已经拿到全部结果,乙认为只拿到一部分。可以核对同一批次文件中的成功条数与任务总数是否一致,再核对失败清单是否为空。若成功条数小于任务总数且失败清单非空,就说明结果不完整。这个核对不依赖任何人的记忆,只依赖落盘记录。
核对完成后,下一步动作也随之明确:缺失项进入补跑清单,已确认部分进入可用结果区。这样分歧就转成了项目状态,而不是口头结论。
有些限流不会返回明确错误,而是返回空结果或超时。空结果不能单独证明任务已经处理正确,也可能是限流、参数错误或数据本身为空。此时应保留原始请求和返回内容,用单条试探请求做对照,再决定是否重试。
另外,具体工具的重试等待时间、配额规则和错误码含义需要以该工具当前说明为准,不同版本可能不同。脚本层面的保护动作可以通用,但涉及具体品牌工具的功能、额度和入口时,应先核对现行说明,不要按旧经验直接推断。
最后,保护已有结果的核心不是把数据抓完,而是让每一次失败都不破坏上一次成功。只要落盘和状态记录到位,限流只是暂停,不会让已有结果作废。