工具app推广渠道:脚本调用工具遇到限流时怎样保护已有结果

📍 WDQWDWQD987AAAAA:216.73.217.33
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /2decb554ce04.html
📄

工具app推广渠道:脚本调用工具遇到限流时怎样保护已有结果

限流发生时,第一目标不是继续把请求打满,而是保住已经拿到的可用结果,并让后续调用可恢复。判断依据是:这些结果是否已经落盘、是否带唯一标识、能否在不重复消耗配额的前提下续跑。若三者都成立,优先做“冻结与续跑”;若结果只存在内存或日志里,优先做“先落盘再降速”,否则重试可能把已有结果覆盖掉。

先判断已有结果属于哪一种可保护状态

限流本身只是信号,真正决定动作的是结果形态。可以把当前结果分成两类:可续跑结果和不可续跑结果。可续跑结果通常每条都带独立主键,例如渠道标识、素材标识或任务标识,重复调用同一条不会产生新语义;不可续跑结果往往只有一次汇总输出,或者写入时按整批覆盖。

判断时看三个证据:结果是否已经写入持久存储;每条记录是否有稳定唯一键;下一次调用能否只请求缺失部分。三问中有两个否定,就不要急着重试,先做落盘和去重准备。

假设一个脚本从推广渠道接口拉取素材明细,已经拿到 300 条,第 301 条触发限流。如果这 300 条已写入本地库并带素材 ID,那么下一步是记录断点、降低并发、只补缺失 ID;如果它们只存在于脚本变量中,进程退出即丢失,那么下一步应是先序列化到临时文件,再决定是否继续。这个例子只用于说明判断方法,不代表任何具体平台的实际行为。

条件一:结果已落盘且可去重时,冻结断点并续跑

当结果已经持久化、且每条有唯一标识时,最稳妥的动作是冻结当前进度,而不是继续试探接口上限。具体实施分三步:

  1. 把已成功获取的标识写入一个已完成集合,例如 done_ids;
  2. 把当前游标、页码或时间窗口写入断点文件,例如 checkpoint.json;
  3. 下一轮调用前先过滤已完成集合,只请求缺失部分,并降低并发或增加间隔。

这个动作的结果是:即使后续再次限流,已获得的结果不会被重复请求覆盖,也不会因为整批重跑而丢失。续跑时如果接口返回的是全量列表,过滤动作仍然必要,否则会把旧结果重新写一遍,可能触发覆盖或重复计数。

例外情况是:接口不支持按标识增量查询,只能按时间窗口拉取。这时应把断点设为“最后成功时间”,并让下一轮从该时间之后开始;如果时间窗口本身也会被限流,则需要把窗口切得更小,而不是提高重试次数。

条件二:结果只在内存或整批覆盖时,先落盘再降速

如果结果尚未落盘,或者写入方式是按整批覆盖,那么限流时的第一动作不是重试,而是把当前内存结果写到临时文件。可以按批次追加写入,例如每 50 条写一次,文件命名带时间戳,避免下一次运行直接覆盖。完成落盘后,再决定是否继续调用。

这类情况下,保护已有结果的关键是“先保存,后重试”。如果直接重试并成功返回全量数据,旧结果可能被新结果覆盖;如果重试失败,内存结果随进程结束消失。先落盘可以把这两种损失都降下来。

降速动作包括:减少并发数、在请求之间加入固定等待、把单次请求的条数调小。降速后如果仍然限流,说明当前配额或调用节奏与接口允许范围不匹配,下一步应检查是否需要更换调用时段、拆分任务,或把非关键渠道的拉取延后。这里不假设任何具体平台的配额数值,实际限制需要以对应工具的当前说明为准。

哪些现象不能单独证明处理正确

请求量下降、抓取量归零或日志里不再出现错误,都不能单独证明已有结果已经被保护好。请求量下降可能只是因为脚本提前退出;抓取量归零可能只是断点过滤生效;错误消失可能只是重试次数用完。更可靠的证据是:已完成集合是否可读、断点文件是否指向正确位置、下一次运行是否只请求缺失部分。

如果发现结果数量比预期少,先检查是不是把“限流后的空响应”当成了成功写入。可以在写入前增加一条校验:响应中是否包含有效标识;没有标识的响应不进入已完成集合。这个动作会影响下一步:只有确认已完成集合可信,续跑才有意义。

把保护动作接到推广渠道任务上

工具app推广渠道的数据往往来自多个来源,限流可能只发生在其中一个。此时不要因为一个来源限流就停掉全部任务。更合理的做法是:按来源分别记录断点和已完成集合,让未限流的来源继续,限流的来源进入等待队列。这样已有结果按来源隔离,后续恢复时不会互相污染。

如果旧脚本或旧合作关系需要退出,但其中一部分渠道数据仍有价值,可以先把这部分结果导出为独立文件,再停止对应调用。导出时保留原始标识和时间字段,方便之后核对是否重复。是否继续保留这些数据,取决于它是否还能支撑当前决策;如果只是历史快照,归档即可,不必继续消耗调用配额。

最后,任何续跑方案都应先在小范围验证:只请求少量缺失标识,确认不会重复写入,再扩大范围。这个动作的结果会直接决定下一步是继续自动续跑,还是改为人工分批处理。

图1 图2

nginx