把中断当成一次未完成的抽样,而不是一次失败:先固定扫描的起点、顺序和过滤条件,再拿中断前已产出的记录去反推覆盖边界。判断能否继续用,不看“扫了多少”,而看被扫对象是否满足同一套入队规则、中断点是否可定位、未扫部分是否与已扫部分同质。三个条件同时成立,已覆盖范围才可以作为后续决策的底稿;缺一个,就应当重新界定范围而不是接着往下跑。
全站扫描的中断通常落在三种边界,处理方式完全不同。第一种是数量边界:扫描到第 N 条记录时停止,队列里还有明确剩余。第二种是结构边界:扫描跨过某个目录、某个模板或某类页面后停止,后续对象与已扫对象形态不同。第三种是条件边界:过滤规则在中途被改动,比如排除规则、去重口径或字段映射变了,导致前后两段不可比。
区分方法很直接:把中断前最后若干条记录和队列中待处理的第一条记录并排看。如果两者字段结构一致、来源规则一致,只是序号不同,属于数量边界;如果待处理对象来自另一种页面模板或另一套命名规则,属于结构边界;如果记录里出现同一对象两种写法、或某个字段突然为空,多半是条件边界。数量边界可以续跑,结构边界要分段评估,条件边界必须回到改动点重算。
要判断已覆盖范围,需要能回答三个问题:从哪里开始、按什么顺序、排除了什么。这三项在扫描开始时如果被记录下来,中断后就能把已扫集合还原成一个可描述的区间;如果没有记录,只能靠已产出记录反推,反推结论的可靠度会明显下降。
一个可执行的动作是:把已产出的记录按来源字段分组,统计每组的最小和最大标识值,再与队列中待处理对象的标识值比较。如果已扫集合在某个分组内是连续区间,而待处理对象恰好接在区间之后,覆盖范围可以写成“该分组内标识值 A 到 B 已处理”。如果分组内出现空洞,说明中断前就有对象被跳过,这些空洞要么补扫,要么在结论里显式标为未覆盖。
中断前扫完的那部分往往看起来“没问题”,但把它当作全站结论之前,要检查是否存在以下不可照搬的情形。
判断是否落入这些情况,可以做一个低成本对照:从已扫集合里按来源分层各抽少量对象,再从待处理队列里按同样分层各抽少量对象,比较两组的字段结构和异常类型。如果两组差异只在数量上,覆盖范围可以延续;如果异常类型不同,说明中断点恰好落在结构变化处,已覆盖范围只能限定在前半段。
根据上面的检查,通常落到三种处置之一。第一,边界清晰且同质,从队列断点续跑,续跑时沿用原有起点、顺序和过滤条件,不改任何参数,避免产生第二套口径。第二,边界清晰但不同质,按结构分段重跑未完成部分,分段结果分别标注来源,不合并成单一覆盖率。第三,边界不清晰,放弃“续跑”思路,用已扫记录反推一份新的种子清单,从清单重新发起一次范围明确的扫描。
假设一次扫描在产出 400 条记录后中断,队列剩余 600 条。若已扫记录按来源分为三组且各组标识连续,待处理对象正好接在每组区间之后,那么可以判定覆盖范围为这三组的连续前缀,续跑即可。若其中一组已扫记录内部出现标识跳跃,而待处理对象里又混有该组对象,则这一组属于边界不清,应单独重扫该组,其余两组照常续跑。这个例子只说明比较方法,实际数字需要按手中数据替换。
续跑不是按一下继续就结束。开始前,确认队列中的待处理对象与已扫对象使用同一套标识规则和过滤条件;结束后,检查新产出记录与中断前记录在字段结构上是否一致,并在新旧交界处抽查少量对象,确认没有重复处理或遗漏。若交界处出现同一对象被处理两次,说明去重口径在续跑时发生了变化,此时应回退到中断点,用统一口径重跑交界段,而不是在结果里手工删除重复项。核对通过后,这份覆盖范围才能进入下一步的分析或交付。