先给结论:不要直接把单个样本上跑通的格式当成全量规范。正确顺序是先判断变化属于“兼容扩展”还是“语义替换”,再用小批量对照验证,最后才改正式输入规范。如果新格式只是增加了可选字段,旧规范通常可以保留并追加;如果旧字段的含义被改写,就必须建立版本隔离,否则规模化后例外会集中爆发。
兼容扩展指的是旧字段仍然存在、含义不变,只是新增了字段或允许了新的取值形式。例如原来只提交标准URL列表,现在允许同时提交带参数的URL,但规范URL字段依旧有效。这种情况下,改动是加法,风险集中在解析和去重环节。
语义替换指的是同一个字段名承载了新含义。比如原来一列是“页面地址”,现在这一列变成了“页面地址加投放标记”,两者混在同一列里。这类变化不能靠追加规则解决,必须拆列或拆文件。判断依据很简单:拿旧数据和新数据各取一条,只看同一字段的值,如果旧值在新规范下会被解释成另一种东西,就属于语义替换。
条件一:变化只影响少数来源,且旧格式仍占多数。此时应保留旧规范为主版本,为新来源单独建一个输入分支。动作是给新来源的文件加来源标识,并在入队前做字段映射,把新字段转成旧规范能识别的形式。这样做的结果是:下游处理逻辑不用动,例外被限制在映射层,后续排查时能直接定位到是哪个来源触发了例外。
条件二:变化覆盖多数来源,旧格式只剩历史存量。此时继续维护旧规范会不断产生转换成本,应建立新规范为主版本,同时保留旧格式的只读兼容通道。动作是先冻结旧格式的写入,只允许读取,再对新格式做一次全量字段校验。结果是历史数据仍可查询,新数据不再走转换层,例外数量会随存量减少而下降。
选择哪一种,不取决于新格式看起来是否更先进,而取决于旧格式在当下数据中的占比,以及转换层能否被稳定测试。占比高、转换逻辑简单,选条件一;占比低、转换逻辑复杂,选条件二。
无论选哪种条件,都不要直接改正式规范。先取一批包含新旧两种格式的样本,同时跑旧规范和新规范,比较三类输出:被识别的对象数量、被丢弃的对象、以及字段映射后的值是否一致。这里要注明假设:样本量只用于暴露差异,不代表整体比例,不能因为样本里旧格式全部通过就推断全量安全。
如果发现被丢弃的对象集中在某一类来源,先查该类来源的字段是否为空或使用了占位符,而不是立刻放宽校验规则。放宽校验会让无效对象进入下游,后续更难清理。
具体实施可以按以下顺序:
例外清单是下一步判断的依据。如果例外集中在少数来源,说明是来源侧格式不规范,应推动来源修正;如果例外分散且数量稳定,说明规范本身缺少对某种取值的定义,需要补充规则而不是继续加映射。
单个样本成立,不代表规模化后成立。以下情况不能直接套用上面的选择:一是对象格式由第三方系统导出,字段顺序和编码不受你控制,此时版本隔离比字段映射更可靠;二是新旧格式同时存在于同一文件内,必须先拆分再处理,否则映射表会互相覆盖;三是格式变化伴随对象标识规则变化,比如原来用数字ID、现在用字符串ID,此时去重逻辑也要同步调整,不能只改输入解析。
另外,输入规范改动后,查询和报告口径可能跟着变化。如果报告里引用的对象数量突然下降,先确认是格式过滤导致的,还是对象本身确实减少,不要直接把数量变化当成效果变化。请求量或抓取量归零也不能单独证明处理正确,它可能是格式不匹配被提前拦截,也可能是来源暂时没有产出,需要结合例外清单和来源状态一起看。
最后,任何规范改动都应保留回滚路径。把旧规范文件和新规范文件同时留档,记录改动日期和触发原因,这样当规模化例外超出预期时,可以快速切回上一版并重新评估条件选择。