限流一旦触发,最该保护的不是“继续跑完”,而是已经拿到的结果和已消耗的调用额度。做法取决于两个条件:这批结果是否可重放,以及限流是临时的还是策略性的。可重放且限流短暂,就退避重试;不可重放或限流持续,就立即落盘、标记断点、停止脚本,改由人工决定后续范围。
可重放的意思是:同一批目标、同样的参数,再跑一次能得到等价结果。如果脚本只做无状态查询,输入清单固定,那就属于可重放。此时遇到限流,正确动作是捕获响应码,等待一段时间后从断点继续,而不是从头再来。
不可重放的情况更常见于旧系统或旧合作关系:接口返回带时间窗口的排序、带会话状态的令牌,或者对方随时可能下线该查询能力。这类结果一旦丢失,重跑未必能复现。此时应把“保存”放在“重试”之前,每成功一条就写入本地文件或数据库,并记录时间戳和请求参数。
判断依据可以看三点:输入是否完全确定、返回是否依赖请求时刻、对方是否承诺接口稳定。三点都满足,才按可重放处理;只要有一点不确定,就按不可重放处理。
临时限流通常表现为短时间窗口内拒绝,等待后恢复;策略性限流则表现为持续拒绝、返回明确的配额说明,或需要申请提额。两者的处理路径不同。
实际动作示例:脚本在每次请求后检查响应状态,遇到限流就把当前进度写入 progress.json,包含已完成的目标标识和最后成功时间。这个动作的结果是:无论进程是否被杀掉,下次都能从断点恢复,而不是重新消耗额度。
条件一:结果可重放,且限流被判断为临时。选择退避重试,但必须加两个约束——单次任务的总重试次数上限,以及总耗时上限。超过任一上限就退出,保留断点。这样做的依据是:继续等待的边际收益在下降,而额度消耗和对方封禁风险在上升。
条件二:结果不可重放,或限流被判断为策略性。选择立即停止自动调用,转为人工处理。人工处理的具体动作是:先导出已保存的结果,核对完整性,再决定剩余目标是改用低频手动查询、申请正式配额,还是直接放弃。放弃也是一种合理选择,尤其当旧合作关系正在退出、剩余目标价值有限时。
两种选择的共同前提是:结果必须先落盘,再谈重试或停止。没有落盘的重试,等于把已有结果暴露在进程崩溃的风险下。
当旧内容、旧系统或旧合作关系需要退出时,脚本限流往往是一个信号:继续全量获取的成本已经高于保留价值。此时应区分三类数据。
假设一个场景:脚本需要查询两百个旧条目的权重指标,跑到第八十条时触发限流。如果这八十条覆盖了当前需要决策的范围,就没有必要为剩余一百二十条继续消耗调用。动作是保存这八十条、记录断点、停止脚本;结果是调用额度不再流失,后续是否补全由业务价值决定,而不是由脚本惯性决定。
有一种例外:限流来自本地网络或代理配置,而非对方服务。此时重试可能立即恢复,但不应默认如此。核对方法是查看返回信息中是否包含配额或频率说明;如果无法区分,先按策略性限流处理,避免反复触发。
另外,不同工具的限流规则、配额说明和恢复方式并不通用,具体以该工具当前文档或服务方说明为准。不要根据旧经验推断某个未验证工具的现行限制,也不要把一次限流现象直接当作对方服务变更的证据。保存结果、标记断点、限制重试次数,这三步在多数情况下都能降低损失,但适用条件仍是:结果值得保留,且后续还有决策用途。