遇到限流时,先不要重跑整批任务。保护已有结果的核心动作是“冻结已完成部分、单独记录未完成部分、只对缺口做小批量重试”。下面按两种条件分别说明:限流是短时突发,还是持续存在。
限流本身不是错误,它只是工具或接口在告诉你当前请求节奏超出了可接受范围。真正需要区分的是:限流是短时突发,还是持续状态。判断依据可以看三个信号:
这一步的意义在于:短时突发可以等待后继续;持续限流则要继续降低并发或改用其他获取方式,否则只会反复消耗已有结果之外的时间。
如果判断为短时突发,推荐的选择是“暂停整批、保留已完成、只重试失败项”。具体动作:
这个动作的结果是:你的结果集只会增长,不会被一次失败覆盖或清空。下一步只需关注失败清单是否在缩小;如果连续几轮都不缩小,就应当转入持续限流的处理方式。
假设一个场景:某次调用共 200 项,成功 150 项后被限流。按上述做法,你保留 150 项,只重试剩余 50 项;而不是重新跑 200 项。假设每轮重试能恢复一部分,失败清单会逐步收敛。这里的数字仅用于说明比较方法,不代表任何工具的实际表现。
如果等待后仍频繁被拒,说明当前调用节奏本身不可行。此时的选择不是“更努力地重试”,而是降低单位时间的请求量,并把中间状态保存下来。可执行的动作包括:
这样做的结果是:即使限流持续,你也能保住已经拿到的部分,并清楚知道缺的是哪一段。下一步应当先确认单请求稳定通过,再逐步提高批次规模,而不是一次恢复到原来的并发。
限流最容易造成的问题不是丢数据,而是把部分结果当成完整结果继续使用。保护已有结果时,必须给每条结果标注完整程度:
这个区分会直接影响下一步:如果部分结果被误当成完整结果,后续分析会建立在缺口之上;如果标注清楚,你就能针对缺口单独补采,而不必推翻全部已有内容。
很多人只保存成功结果,失败项随手丢弃,结果限流恢复后只能重新全量调用。保护已有结果的一个关键动作,是把失败清单也当作正式产物保存下来,包含失败项标识、失败原因和失败时间。这样在限流解除后,你可以只针对失败清单调用,而不是重新开始。若失败原因显示是参数错误而非限流,则应当先修正参数再重试,否则重试多少次都不会成功。
最后需要核对的是:你所使用的具体工具或接口对限流后的重试是否有额外限制,这部分信息以该工具的当前说明为准,不要凭经验假定。把已完成结果、部分结果和失败清单分开保存,再按限流类型决定继续、降速还是补采,已有的结果就不会因为一次限流而白费。