小流量灰度之所以能暴露全量发布的例外,是因为它把“大多数请求正常”与“所有请求正常”拆成了两件事。灰度期间,只要有一类请求路径、一种缓存状态或一个旧插件入口没有走到,全量发布后它就会成为例外。判断是否继续全量,不取决于灰度流量百分比,而取决于灰度是否覆盖了那些你准备保留、改写或退出的旧对象。
常规灰度按用户或IP比例放量,但旧内容、旧系统接口和旧合作关系留下的入口往往不按比例出现。例如一个旧表单页只被外部合作方调用,日常访问量极低,灰度阶段几乎不会被触发。全量发布后,该入口一旦报错,影响的是那条合作链路,而不是普通访客。
要发现这类例外,灰度期间应主动构造请求,而不是等待自然流量。具体动作是:列出准备退出的旧路径清单,在灰度环境逐条发起请求,记录返回状态、响应时间和是否触发回退逻辑。如果某条路径返回异常,下一步不是立刻全量,而是先决定这条路径属于保留、改写还是退出。
三者不是按新旧程度排序,而是按“是否仍有外部依赖”和“迁移成本是否低于维护成本”来分。
一个假设例子:某站点准备退出旧产品页,灰度时只测了首页和文章页,全量后发现旧产品页仍被合作方书签调用。此时若选择保留,就把它加回灰度清单;若选择改写,就把它指向新页面并验证跳转;若选择退出,就返回410或301,并通知调用方。三种选择对应三种不同的下一步。
灰度中如果只观察页面是否打开,容易把主机层限制误判为内容问题。例如旧路径返回403,可能是主机防火墙规则、目录权限或WAF策略,而不是页面被删除。区分方法是:在灰度环境用同一路径分别请求静态文件和动态接口,如果静态文件也返回403,优先检查主机层规则;如果只有动态接口异常,再检查应用层。
需要说明的是,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。灰度期间若发现某路径抓取量归零,不能单独证明退出动作正确,还可能是因为该路径本身无内链、响应变慢或临时不可用。应结合主机访问日志和应用日志一起看。
在灰度结束、准备全量之前,至少完成一次针对例外路径的验证。动作可以按以下顺序:
这个动作的结果会直接影响下一步:如果例外路径集中在主机层,就先改规则再全量;如果集中在应用层,就先改代码再全量;如果确认无依赖,才执行退出。灰度流量比例本身不决定全量时机,覆盖范围才决定。
退出不等于全部删除。仍然有价值的部分通常包括:外部仍在使用的跳转关系、历史内容中的内链目标、以及合作方约定的回调地址。这些部分应改写为稳定入口,而不是随旧系统一起下线。判断标准是:如果移除后会导致外部请求失败且无法快速通知对方,就应先保留一个过渡状态,再安排退出时间。
HTTPS不保证安全无漏洞或排名,因此退出旧路径时不能仅凭协议变化判断风险已消除。不同搜索引擎对旧路径的处理支持情况须分别核查,不能把一家平台的观察结果直接套用到另一家。灰度暴露的例外,最终要落到具体路径的具体处置上,而不是笼统地全量或回退。