因为灰度流量小,命中的多是主路径;全量后长尾路径、缓存状态和跨系统时序才被放大。要解决的不是“再等等看”,而是把分歧变成可核对的项目:谁在什么条件下看到什么结果,下一步由谁验证。
假设一个情境:团队为一批新域名完成注册购买后,准备把站点从旧域名切到新域名。灰度阶段只让少量内部访问走新域名,页面正常。全量发布后,部分用户反馈跳转异常、部分页面打不开,运营、开发、运维三方对“是否已生效”各执一词。这不是谁不认真,而是三方观察的对象不同:运营看的是浏览器地址栏,开发看的是应用日志,运维看的是解析记录和证书状态。
把分歧转成项目,需要固定三件事:观察对象、观察条件、判定标准。例如“运营在未登录浏览器访问首页,看到的是新域名且证书有效”才算通过;“开发在应用日志中看到请求落到新域名”才算通过。不同角色可以有不同的判定标准,但必须写清楚,否则同一句“已经好了”会被理解成不同事实。
小流量灰度容易漏掉全量才出现的例外,常见原因是观察条件太窄。可以按下面的顺序逐项核对,每项都写出“谁看、在哪看、看到什么算通过”:
以上任意一项不通过,下一步都不应继续扩大流量,而应回到该项对应的负责人重新核对。这个动作的结果直接决定下一步:如果解析未生效,继续放量只会让更多用户看到旧地址或错误地址;如果跳转丢参数,先修跳转规则再放量,否则统计和落地页都会失真。
全量发布后,团队常把某些现象当作“已经处理正确”的证据,但这些现象还有别的解释:
不同搜索引擎对同一配置的支持情况须分别核查,不能用一个引擎的表现推断另一个。把“某个现象消失”当成唯一结论,最容易在全量后反复回退。
当灰度与全量结果不一致时,先判断影响范围,再决定回退还是修复。可以用一个假设的比较方法:把受影响的请求按“是否带参数、是否登录、是否命中缓存”分成几组,分别统计各组异常比例。如果异常集中在带参数路径,优先修跳转规则;如果各组都异常,优先检查解析和证书。这个分组只用于说明判断方法,不代表真实数据。
回退不是失败,而是把不确定的改动收回,换取可核对的状态。回退后要记录:回退前哪些条件满足、回退后哪些现象消失、哪些现象仍在。仍在的现象说明它可能不是本次改动引起,需要另开核对项。这样下一轮放量时,团队面对的是更小的分歧集合,而不是同一场争论重来一遍。
下一次灰度放量前,至少固定一个检查点:由谁在什么网络环境下,用哪个域名访问哪条带参数的路径,看到什么结果算通过。这个检查点要能覆盖灰度与全量的差异来源——解析、证书、缓存、跳转。检查点通过后再扩大流量;不通过就停在当前流量,由对应负责人修复后重新核对。域名注册购买本身只是起点,真正决定发布节奏的是这些可核对的条件是否同时成立。