限流出现后,先不要重跑整批任务。更稳妥的做法是把已拿到的结果视为不可再生资产:立即停止继续请求,把内存或临时输出落盘并加校验,再决定是等待恢复后续跑、降速改写调用方式,还是终止任务改用人工抽样。是否值得继续,取决于已覆盖比例、任务是否可断点续跑,以及限流是短时拥塞还是持续拒绝。
限流不是一种情况。短时并发过高、单位时间配额用尽、账号或调用凭证被临时冻结,表现都可能是请求失败,但恢复时间差别很大。你可以用一个小规模探测请求判断:间隔一段时间后只发一条最低成本请求,若成功,说明多半是节奏问题;若仍失败且返回信息指向配额或权限,则更可能是持续性限制。
这一步的实际动作是记录失败时间、失败前成功条数和返回信息,然后暂停主流程。它的结果决定下一步:短时节奏问题值得等待后续跑;持续拒绝则应优先保存和整理,而不是消耗时间反复重试。
脚本运行时结果常留在内存、队列或临时变量里,一旦进程退出就丢失。遇到限流,先做三件事:把已完成记录写入本地文件;为每批输出编号并记录对应的输入范围;对写入内容做条数或字段完整性校验。这样即使后续不再调用,已有结果仍可被使用和核对。
一个假设例子:某脚本计划处理1000条输入,限流发生时已成功返回420条。如果直接重跑,可能再次触发限流并覆盖旧文件;如果先把420条写入带编号的结果文件,再记录断点位置,后续就能从第421条继续,而不必重复消耗配额。这个数字只是说明比较方法,实际以你的任务规模为准。
三种处理方式并非都适合同一场景。选择时可以对照下面的条件:
如果你不确定限流原因,优先选择保留已有结果,再做一次低成本探测。探测结果比主观猜测更能决定是否继续。
续跑最容易出的问题不是再次限流,而是重复写入和错位。续跑前确认三件事:断点记录的是输入序号还是输出序号;失败的那一条是否已被计入成功;结果文件是否按追加方式写入而非覆盖。若脚本没有断点记录,可以先从结果文件反推已完成的输入范围,再人工指定起点。
实际动作是先用一小批输入试跑续跑逻辑,核对输出条数与断点是否吻合,再放开批量。这个动作的结果会直接影响你是否信任后续数据:如果试跑出现重复或缺口,应先修正写入逻辑,而不是继续扩大请求量。
当限流原因不明、已有结果已能回答当前问题、或继续调用可能影响同一凭证下的其他任务时,退出是合理选择。尤其是共享调用凭证的场景,持续重试可能让其他依赖同一凭证的流程一起失败。
退出不等于丢弃。把已有结果整理成带时间、输入范围和完成比例的记录,明确哪些部分缺失,再决定是否需要换时间、换调用方式或改用人工抽样补齐。这样做的代价是结论覆盖范围变窄,但避免了在受限状态下反复消耗。