判断已覆盖范围不能只看扫描日志的末尾,而要把“中断点”还原成任务队列:先确认扫描是按可枚举的清单推进,还是按动态发现逐层展开。前者可以靠清单比对确认剩余部分,后者只能靠已产出的记录反推边界,并接受一定的不确定性。下面用一个假设情境把决策过程走一遍。
自动发帖推广工具的“全站扫描”通常有两种组织方式,中断后的可判断程度完全不同。
判断动作:打开任务记录,看是否存在一个独立于扫描过程、在开始前就已固定的输入清单。如果存在,覆盖率可以精确计算;如果不存在,只能给出“至少覆盖了这些”的下界,不能给出百分比。这个区分的直接后果是:清单式可以从中断处续跑并合并结果,发现式续跑会产生重复,需要先去重再决定是否重扫。
假设有一个自动发帖推广工具任务,对某站点做全站扫描,目标是找出所有可发布目标。任务跑到中途被中止,日志停在某个对象编号。操作者直接点“继续”,工具从断点往后跑。跑完后,记录总数比预期少,但没人能说清少的是“本来就不存在”还是“中断期间被跳过”。
这个假设里暴露的正是发现式扫描的边界问题:中断发生时,正在处理的那个对象可能已经发现了一部分下级对象但没来得及入队,续跑从断点之后开始,这批“已发现未入队”的对象就永久丢失。清单式扫描不会有这个问题,因为清单在开始前就固定了,断点前后只是同一份列表的不同区间。
可区分的证据是:把中断前后的记录按发现来源分组。如果大部分记录来自预先给定的清单,丢失风险低;如果记录大量来自“从上一个对象解析出来”,那么中断点附近就是高风险区,需要单独重扫这一段,而不是整体重跑。
在不重扫的前提下,可以从已有数据里找三类信号,交叉验证边界。
动作与结果:先做差集,若差集为空则覆盖率可确认;若差集非空,把差集对象单独跑一遍,而不是重跑全站。这样做的结果是新增记录只可能来自未覆盖区间,不会与已有记录混淆,后续判断是否真正完成时依据更干净。
个别样本上,续跑看起来能补齐结果,是因为样本量小、发现层级浅,丢失的支路不明显。规模化后例外出现在这些条件同时成立时:扫描对象之间存在多层引用、中断发生在解析密集的阶段、工具没有把“已发现未入队”的状态持久化。此时续跑会系统性地漏掉中断点附近的一整层对象,而日志表面上仍是连续的。
判断是否落入这个边界,可以看一个指标:中断点前后各取一段记录,比较单位时间内新增对象的数量。如果中断后明显低于中断前,且不是对象本身变稀疏造成的,就应按“高风险区重扫”处理,而不是按“已完成”处理。反过来,如果中断前后密度接近,且存在固定清单做差集验证,续跑结果才可以当作可用范围。
覆盖范围判断的终点不是一个百分比,而是决定接下来做哪件事:
需要提醒的是,扫描记录数量归零或抓取量骤降,都不能单独证明处理正确。它们同样可能来自目标本身没有下级、请求被目标站点限制、或工具在中断后没有恢复队列。具体工具是否持久化中间状态、是否支持按区间重扫,需要以该工具当前版本的说明为准,不同版本行为可能不一致。把判断建立在可核对的清单和引用关系上,比依赖日志末尾的编号更稳。