灰度只验证了“被抽到的那部分请求”,而404优化真正容易出例外的,是那些在灰度样本里几乎不出现、却会在全量流量中集中出现的入口。结论有前提:只有当灰度覆盖了主要入口类型、状态码返回路径和重定向链路时,它的结果才可以外推到全量;否则灰度通过只能说明样本内成立。
小流量灰度通常按比例切流,切到的是整体请求的一个子集。问题在于,404请求并不均匀分布在所有URL上。被大量外链、历史收藏、站内旧路径指向的地址,往往在灰度阶段只占极小比例,甚至完全没被抽中。于是灰度里看到的“404页面返回正常、跳转正确、日志干净”,很可能只是因为那些最容易出问题的入口还没进来。
判断灰度是否可信,先看它覆盖了什么。如果灰度只覆盖首页、栏目页和少量内容页,而404主要来自旧文章路径、已下线的活动页、被外部引用的资源地址,那么样本与全量之间的入口结构差异就足以让结论失效。
下面几类例外有共同特征:它们在总请求里占比低,但在404总量里占比高,因此按比例灰度时容易被稀释掉。
这些例外的共同点是:它们不是“更多同样的请求”,而是“不同类型的请求”。按比例放量不会自动提高类型覆盖率。
假设某站把旧版文章路径统一301到新版路径,灰度放量1%,观察到404页面返回200、跳转正常、无异常日志,于是决定全量发布。全量后却发现,带?from=参数的旧地址没有命中重定向规则,直接落到404,而这类地址在灰度样本里恰好一个都没被抽到。
这个例子的重点不是“灰度没用”,而是灰度验证的规则和全量实际收到的请求类型不匹配。灰度通过说明的是:在它抽到的请求里,规则成立。它不能说明规则覆盖了全部请求形态。
要让灰度结论站得住,需要把“按比例切流”换成“按入口类型切流”,或者至少补一层类型核对。
其中最关键的动作是第2步:在灰度结束、决定是否全量之前,先做一次路径模式分布对比。如果发现灰度样本缺少全量中占比高的某类路径,下一步就不是放量,而是把这类路径补进灰度重跑。这个动作直接决定全量发布是否安全。
使上述结论失效的反例很明确:如果站点的404几乎全部来自单一入口类型,且灰度已完整覆盖该类入口,那么按比例灰度就足以支撑全量决策,额外的类型切分反而增加成本。
下一步动作取决于分布对比的结果:灰度与全量路径模式接近时,可以放量并保留回退开关;差异明显时,先补齐缺失类型再重跑灰度。无论哪种情况,都不要把灰度通过当作全量安全的证明,它只证明了一个有边界的样本。