批量脚本在第二次运行时突然少处理了三分之一页面,最常见的解释有两种:一是跳过条件写得太宽,把“暂时不该动”的页面误判成“永远不该动”;二是跳过条件本身没错,但上游数据口径变了,导致原本符合条件的页面不再进入待处理队列。要区分这两者,先看被跳过页面在上一次运行中的状态记录,再看本次数据源的筛选口径是否与上次一致。
状态判断依赖页面当前的表现,比如索引状态、抓取返回码、最近一次内容更新时间。身份判断依赖页面本身的属性,比如模板类型、URL 层级、是否属于商品详情或分页。批量处理时最容易出问题的是把状态判断写进身份判断的位置。
假设一个脚本要跳过“最近 30 天内已修改过”的页面。这是状态判断,前提是上次运行留下了准确的修改时间。如果时间字段来自一个会在每次抓取时刷新的日志,那它就不再反映真实修改时间,跳过范围会随抓取频率变化。这种情况下,跳过条件看似稳定,实际依赖的上游字段已经变质。
可区分的证据是:把被跳过的页面按“上次运行是否处理过”分组。若两组都有大量跳过,更可能是身份判断或数据口径问题;若只有上次处理过的那组被跳过,则状态判断生效,属于预期行为。
业务前提变化通常有三类:站点结构改版、内容策略调整、数据源更换。这三类变化对跳过条件的影响不同,不能共用同一套规则。
实际动作:在批量脚本里增加一个“跳过原因”输出字段,记录每个被跳过页面命中了哪条规则。运行一次后统计各规则的命中数量。如果某条规则的命中量远高于预期,先检查该规则依赖的字段是否在本次数据源中仍然存在且语义未变。这一步的结果直接决定下一步是改规则还是改数据源。
总量下降不能单独证明跳过条件设置正确。抓取量减少可能来自抓取预算收紧、站点响应变慢、或上游队列本身变短。要验证跳过条件,必须做定向抽样。
假设一个批量任务原本处理 1000 个页面,本次只处理了 600 个。不要直接接受这个结果。从被跳过的 400 个里随机抽 20 个,逐个检查:它们是否真的不该被处理?如果其中超过 5 个其实应该处理,说明跳过条件过宽。再从被处理的 600 个里抽 20 个,检查是否有本该跳过的混进来,说明条件过窄。
抽样的前提是你能定义“应该处理”的标准。这个标准最好在批量运行前就写下来,而不是运行后根据结果反推。否则抽样会变成自我验证,失去区分能力。
跳过条件不是孤立的一行判断。它决定了哪些页面进入下一步,也决定了日志里哪些页面没有记录。如果跳过发生在写入日志之前,被跳过的页面就完全消失了,后续无法审计。建议把跳过判断放在日志写入之后、实际处理动作之前。这样即使页面被跳过,也能在日志里看到它被跳过的事实和原因。
另一个衔接点是重试机制。如果跳过条件依赖一个可能暂时不可用的外部接口,比如索引状态查询,那么接口超时和“确实不该处理”会被混为一谈。此时应把超时单独记为一种跳过原因,并在下一轮运行中重新纳入待处理队列,而不是永久跳过。
比较改动效果时,要意识到季节和搜索需求变化会同时影响页面表现。一次跳过条件调整前后的数据差异,不能全部归因于这次调整。合理的做法是保留一组未受调整影响的对照页面,观察同期变化,再判断调整本身是否产生了预期之外的影响。