限流发生时,最危险的不是扫描变慢,而是把“结果不完整”误当成“扫描完成”,让后续处置基于残缺数据推进。保护已有结果的核心动作是让每次脚本调用都落盘、可续跑、可判定完整性;只要做到这一点,限流只是节奏问题,不会变成数据事故。
脚本调用木马扫描工具遇到限流,通常有两种来源,它们的证据和应对方向不一样。
区分二者的证据是:把同一组小样本任务换到另一条出口链路、另一个时间段各跑一次。如果换链路后恢复,问题在本地或链路;如果换时间后恢复、换链路无效,问题更可能在接口侧配额。这个判断决定下一步是调脚本还是调调用节奏。
很多脚本把结果攒在内存里,全部跑完才写文件,一旦中途被限流打断,已完成的部分也一起丢失。改成边跑边写是最直接的补救。
具体动作:每完成一个目标或一批目标,就以追加方式写入结果文件,同时记录该批次的标识、时间戳和状态。这样即使进程被杀,已经确认的扫描结论仍在磁盘上。写入完成后,脚本再更新一个进度记录,标明“下一批从哪个位置开始”。
这个动作的结果会直接影响下一步:有了进度记录,续跑时可以从断点继续,而不是整批重扫;整批重扫不仅浪费时间,还会再次触发限流,形成恶性循环。
限流环境下的批次划分要满足两个条件:单批足够小,能在一次配额窗口内跑完;批次边界稳定,重跑时不会漏项也不会重复计数。
假设某脚本把 1000 个目标一次提交,中途被限流打断,内存结果全部丢失;改成每 50 个一批落盘后,最坏情况只损失当前这一批,前 950 个的结论仍然可用。这里的数字只用于说明批次大小与损失范围的关系,实际取值需要根据配额窗口和自己的容忍度调整。
限流提示出现后,立即停止当前批次的重试,而不是原地快速重试。原地重试会持续占用配额,让恢复时间被不断推后。
可行的做法是:记录当前批次未完成的位置,退出本次运行,等待一个明显长于上次间隔的时间后再从断点续跑。等待期间不要并发启动多个脚本实例去“抢”配额,多实例并发通常会让限流判定更严格。
判断退让是否有效的证据是:续跑后前几批是否稳定完成。如果仍然在同样位置失败,说明退让时间不够或批次仍然过大,应继续缩小批次或延长间隔,而不是加大重试次数。
限流场景下,“脚本正常退出”不等于“结果完整”。需要一份独立于脚本运行状态的完整性判定。
只有这三项都对上,才能把结果交给后续处置。如果差额无法解释,应回到断点记录排查,而不是凭印象认为“大部分已经扫过了”。请求量或失败次数归零本身不能证明处理正确,它也可能意味着脚本根本没发出请求、目标清单为空,或者写入环节静默失败。
如果这个木马扫描工具是通过脚本长期调用的,限流就不该被当成偶发故障,而应写进脚本的默认行为:批次可配置、断点必落盘、限流即退让、完整性单独校验。具体工具的频率上限、配额规则和错误码含义需要以该工具当前文档或实际返回为准,不同工具差异较大,不能照搬。
按这个思路改造后,限流带来的影响被限制在“当前批次重跑”这一层,已有结果始终可用,后续处置也不必因为数据残缺而返工。