假设你准备把主站从旧域名迁到新域名,先拿一个低流量子目录做灰度:只让少量入口指向新域名,其余仍留在旧域名。灰度期间新域名表现正常,于是你决定全量切换。全量后却出现一批灰度里从未出现的例外——某些旧链接、某些参数页、某些区域的访问路径仍然落在旧域名上,形成两套地址同时可访问。灰度没有失败,它只是没有覆盖到这些路径。问题出在:你用“灰度正常”当成了“全量也会正常”的证据。
灰度是一个受控样本,它验证的是“被选中的那部分路径在切换后是否按预期工作”。它能暴露配置错误、跳转链过长、证书不匹配这类会在样本内重复出现的问题。但它不能验证样本之外的路径。
具体来说,灰度通常覆盖不到三类东西:
www 与不带、http 与 https、大小写不同的主机名,可能是不同的可访问入口,灰度只测了其中一种。因此,灰度正常只能说明“样本内正常”,不能说明“全量正常”。这个区别决定了你下一步该做什么。
发现例外后,通常有两条路可走。
适用条件是:例外路径的流量占比很低,且旧域名仍可访问、不会立刻失效。代价是两套地址会在一段时间内并存,你需要持续监控哪些路径还在旧域名上,并接受这段时间内信号分散。如果旧域名即将到期或必须立即停用,这条路不成立。
适用条件是:旧域名还能维持一段时间,且你能列出例外路径的清单来源(如服务器访问日志、站点地图、外部链接报告)。代价是发布时间推后,但全量时的一致性更高。如果例外路径数量极大、无法在合理时间内枚举,这条路会拖得很久。
选择的关键不是哪个“更对”,而是旧域名还能撑多久、例外路径能否被枚举。这两个条件不同,答案就不同。
灰度的样本是你选的,例外是日志里真实存在的。把切换前后的服务器访问日志按主机名分组,就能看到哪些请求仍落在旧域名上。这个动作的结果直接决定下一步:
这一步的价值在于把“例外”从模糊感觉变成可枚举的清单,从而让上面的取舍有依据。
在判断例外是否已处理时,有几个信号常被过度解读:
把这些信号当作“已解决”的证据,会让例外继续存在而你以为已经结束。
回到开头的假设情境:灰度正常、全量后出现例外。此时合理的收尾不是“再等等看”,而是先回答两个问题——旧域名上还有哪些路径在被请求,这些请求是否来自同一个入口。如果来自同一入口,修入口;如果分散,按流量排序逐批处理,每处理一批就重新看日志,直到旧域名请求稳定在预期范围。这个动作的结果会告诉你:是可以结束迁移,还是需要回到灰度阶段重新扩样。灰度暴露的不是发布本身有问题,而是“样本代表整体”这个假设不成立。