把“唯一责任方”定义成一条可核对的规则:谁生成、谁发布、谁校验。多系统同时生成网址规则时,先别急着改代码,而是拿你手上那份规则清单,把每条规则拆成来源、发布通道、校验记录三列,再指定一个系统作为最终写入方。只有一条规则能进入线上生效路径,其余系统的输出只能作为建议或输入数据。
把你现有的网址规则导出成一张表,每条规则至少记录四项:规则文本、生成它的系统、它最终被哪个文件或配置读取、最近一次生效的时间。很多冲突之所以反复出现,是因为表格里只写了规则内容,没写“谁写的”。
盘点的关键是找到写入点。假设一个场景:A 系统负责从域名库生成规范化前缀,B 系统负责根据业务分类拼接路径,C 系统负责在发布前做统一格式化。三者都输出规则,但真正被服务器读取的只有一份配置文件。此时唯一责任方不是“最懂规则的那个团队”,而是那个配置文件的所有者。其他系统的输出必须经过转换才能写入该文件,转换脚本本身也要有归属。
如果盘点后发现同一份配置被两个发布流程覆盖,先冻结其中一个发布流程,再决定谁保留写入权。冻结动作本身会影响后续判断:冻结后如果规则不再漂移,说明冲突来自双写;如果仍然漂移,说明还有第三个未登记的写入方。
不要笼统地说“由 SEO 负责”或“由平台负责”。把责任拆成三段,每段只留一个主责角色:
三段分离后,唯一责任方落在发布段。生成段和校验段可以有多个参与者,但发布段只能有一个。这样定义的好处是:当两个系统给出不同规则时,不需要争论谁更正确,只需要看谁拥有发布权。没有发布权的系统,其输出只能进入待审队列。
当多个角色对同一事实理解不同,例如同一批域名被拼成两种路径,不要用会议结论压下去,而是生成一份差异记录。每条差异至少包含:原始输入、A 系统输出、B 系统输出、当前线上实际值、差异类型(前缀不同、分隔符不同、大小写不同、默认值不同)。
差异类型能帮你区分原因。前缀不同通常来自模板版本不一致;分隔符不同通常来自格式化层执行顺序不同;大小写不同通常来自某一方做了额外规范化;默认值不同通常来自参数缺失时的兜底逻辑不同。假设一个短例子:输入域名相同,A 输出带末尾斜杠,B 输出不带,线上最终带斜杠。核对后发现发布段读取的是 A 的输出,B 的输出只写进了日志。此时唯一责任方已经明确,需要处理的是 B 的日志是否会造成误导。
拿到差异记录后,下一步动作是给每条差异指定处理方式:采纳、丢弃、或转为待验证。采纳意味着把该输出并入发布段;丢弃意味着在生成段关闭该分支;待验证意味着先不写入线上,而是用一小批输入做对照。这个动作的结果会直接影响后续是否还需要保留双系统生成。
有些场景确实需要两个系统同时生成,例如迁移期新旧规则并行。此时唯一责任方仍然是发布段,但需要额外定义校验规则:新规则必须满足哪些条件才能替换旧规则。条件应当是具体的、可核对的,例如“同一输入下,新规则与旧规则的路径段数量一致”“新规则不产生空段”“新规则在发布段记录中可追溯到唯一版本号”。
不要用“多数系统输出一致”作为判断依据,因为多个系统可能共享同一个错误模板。校验规则要能独立于生成系统运行。如果校验失败,发布段保持旧规则,生成段继续调整;如果校验通过,发布段切换,旧系统降级为只读或停止输出。这个切换动作会影响下一步:切换后如果线上规则稳定,说明发布段单一写入生效;如果不稳定,需要检查是否有未登记的写入路径。
唯一责任方如果只写在文档中,下一次多系统同时生成时仍会冲突。更可靠的做法是把它写进配置和发布记录:发布段的配置中声明“本文件为唯一写入目标”,发布记录中记录每次写入的来源系统、版本号和校验结果。任何其他系统尝试写入时,应当被拒绝或进入待审队列。
检查时,用一份实际页面或规则清单走一遍:找到它的生成来源、发布记录、校验记录。如果三处指向同一个发布段,责任方定义就是可执行的;如果三处指向不同系统,说明定义还停留在口头。此时不要继续增加规则,先修正发布段的唯一性,再处理规则内容本身。