先别急着改发布脚本,第一步应该判断这次回退是“发布系统主动写回”还是“索引侧仍在消费旧配置”。两者的证据不同:前者通常能在发布流水线里找到一次提交或一次部署记录,后者往往只有抓取和渲染结果变化,发布侧却没有新动作。你要追踪的是写入路径,而不是最终看到的那份旧值。
配置覆盖回旧值,常见形态有三种。第一种是发布系统在部署时把配置目录整体替换,旧值来自上一次构建产物;第二种是配置中心与发布系统各自持有一份值,发布系统写入后又被配置中心的旧版本覆盖;第三种是发布成功但索引侧读取的是缓存或旧快照。三种形态的追踪入口完全不同。
如果发布记录里能看到一次明确的写入,且时间点与旧值出现时间接近,优先按形态一处理,去查构建产物和模板变量。如果发布记录没有新写入,但配置中心有版本回滚记录,按形态二处理。如果两边都没有变化,而抓取结果里的旧值稳定出现,才考虑形态三,此时追踪重点转向缓存和读取链路,而不是发布逻辑。
保留适用于旧值本身无害、只是与当前预期不一致的情况。例如旧值只是把某个参数设回默认,不影响页面是否可被抓取。保留的前提是你已经确认旧值不会扩大影响面,并且能接受它在下一次发布前继续存在。
改写适用于旧值会改变索引行为的情况,比如把允许抓取改成了限制抓取。改写的前提是你能定位到写入点,并且有办法让新值在发布后不再被覆盖。如果只改最终文件而不改写入来源,下一次发布很可能再次回退。
退出适用于覆盖来源无法在短期内修复、且旧值持续造成影响的情况。退出的做法是暂时把该配置从发布系统的管理范围中移出,改由人工或独立流程控制,直到覆盖问题解决。退出的代价是失去自动化,所以只适合影响明确且修复周期较长的场景。
假设一个场景:某目录下的配置文件在发布后变成旧值,你在发布日志里找不到对应写入。可以做一个最小实验,只针对这一个文件,不扩大改动范围。
这个实验的关键是区分“文件被改写”和“读取到旧内容”。如果文件本身没变,问题就不在发布写入,继续追发布脚本只会浪费排查时间。如果文件确实被改写,再回到写入路径上找来源。实验完成后,下一步动作取决于结论:写入侧问题就修写入来源,读取侧问题就查缓存刷新条件。
第一个误判是把抓取限制当成索引移除。robots.txt 限制抓取,不等于页面已经从索引中移除,也不等于旧配置的影响已经消失。你看到的旧值可能仍然存在于索引数据中,只是抓取行为变了。追踪来源时要看配置写入,而不是把抓取日志当作唯一证据。
第二个误判是把某次统计归零当作处理正确。请求量或抓取量下降,可能是发布回退导致,也可能是抓取预算调整、外部链接变化或索引侧正常波动。归零本身不能单独证明你的修复生效,需要结合写入记录和读取记录一起判断。站点地图提交也不保证收录,它只能作为发现路径的参考,不能用来验证配置是否被正确写入。
每次回退处理后,至少留下三个检查点:写入来源是否唯一、读取链路是否绕过缓存、下一次发布是否会再次覆盖。写入来源唯一,意味着配置只有一个权威写入点,减少互相覆盖的可能。读取链路明确,意味着你能判断旧值是写进去的还是读出来的。下一次发布的覆盖风险,决定你是保留当前修复还是继续退出自动化。
如果这三个检查点里有一个无法确认,就不要急着宣布问题解决。先把这个检查点补齐,再决定保留、改写还是退出。追踪的目标不是找到一份旧值,而是找到它每次出现的路径,并让这条路径在下一次发布时不再产生同样的结果。