遇到限流时,先保住已经拿到的结果,再决定是继续补查还是收工。最稳妥的做法是:每完成一批查询就落盘一次,并把“已确认完成”和“尚未开始”分开记录;限流发生后,不要立即重跑整批任务,而是从未完成的位置继续。这样即使调用被中断,已有结果也不会因为重试逻辑被覆盖或重复消耗。
矛盾往往出现在同一个脚本上:有人看到限流后直接重跑,结果发现部分关键词位置查询结果缺失;也有人暂停后手动补查,反而把数据弄乱了。两种做法都可能失败,原因不在“重跑”或“暂停”本身,而在于脚本是否知道哪些结果已经安全保存。
一种解释是:限流只是调用频率被临时拒绝,已有结果仍在内存里,只要不覆盖就能保留。另一种解释是:限流触发了脚本的异常分支,导致未写入磁盘的批次被丢弃,重跑时又从第一批开始,于是旧结果被新结果覆盖,或者因为重复调用再次触发限流。
区分这两种解释,可以看三个证据:第一,检查日志里最后一次成功写入的时间点,是否早于限流发生时间;第二,查看输出文件是否包含完整批次,而不是只有部分字段;第三,观察重跑后总条数是否减少或重复。如果日志显示写入成功但文件条数不对,问题在落盘逻辑;如果日志根本没有写入记录,问题在异常处理。
具体动作可以这样设计:把待查对象按固定数量分成小批,每批调用完成后立即写入一个独立文件,文件名包含批次序号;同时维护一个进度文件,记录最后成功的批次号。限流发生后,脚本读取进度文件,从下一批继续,而不是从第一批重来。
这个动作的结果会直接影响下一步:如果进度文件准确,你只需要补查剩余批次,已有结果不受影响;如果进度文件缺失或写坏,你只能根据已落盘的文件人工推断断点,代价是可能重复调用少量批次,但不会丢失已保存的数据。假设一批有二十个对象,限流发生在第三批中途,那么前两批文件完整,第三批可能不完整;此时应丢弃第三批的临时文件,从第三批重新开始,而不是从第一批重跑。
选择继续补查的条件是:限流是暂时性的,且剩余批次数量可控,已有结果已经安全落盘。此时可以降低调用频率,延长批次间隔,再继续执行。代价是整体耗时增加,但数据完整性高。
选择收工的条件是:限流反复出现,或者剩余批次占比很大,继续补查的边际收益低于重新安排一次完整任务。此时应保留已有结果,标记未完成部分,等调用环境稳定后再单独处理。不要为了凑满数量而反复重试,因为重复调用可能让限流时间延长,反而影响后续补查。
两种选择的分界不是固定数字,而是看已有结果是否足够支撑当前决策。如果已有结果已经覆盖主要对象,剩余部分不影响结论,可以先收工;如果缺失部分恰好是关键对象,则应继续补查。
假设一个脚本需要查询一百个对象的位置,每批十个。执行到第四批时收到限流提示。此时前三批文件完整,第四批只写入了一部分。按照保护已有结果的原则,应保留前三批,删除第四批的不完整文件,记录断点为第四批开头。下一步有两种做法:一是等待一段时间后从第四批继续,二是先检查前三批结果是否已经能回答当前问题。如果前三批已经覆盖了主要关注对象,可以先基于已有结果做初步判断,再决定是否补查剩余批次。这个例子的数字仅用于说明比较方法,不代表任何工具的实际限额。
上述做法适用于脚本自身可以控制写入时机的场景。如果调用的是外部工具且结果只保存在对方界面中,落盘动作可能无法由脚本完成,此时保护已有结果的方式会不同,需要先确认该工具是否提供导出或分页保存能力。具体功能与限制应以实际工具的当前说明为准,不要假设某个按钮或入口一定存在。
另外,限流提示本身不能单独证明已有结果一定安全。它只说明调用被拒绝,不代表之前的结果已经写入。因此,判断依据应放在日志、文件条数和进度记录上,而不是放在限流提示的文字上。