小流量灰度不会替你验证全量规则,它真正暴露的是例外:那些在抽样流量里没被命中的旧路径、旧参数和旧跳转。灰度结果正常,只说明被抽到的那部分正常;全量发布后出现死链,往往不是灰度失败,而是灰度样本没有覆盖到例外分支。下面从这一矛盾现象切入,给出两种解释和可区分的证据。
灰度通常按流量比例或用户分桶放量,命中哪些 URL 带有随机性。旧内容、旧系统或旧合作关系退出时,被清理的往往是低频路径:多年未更新的栏目页、带历史参数的详情页、只被少数外链指向的落地页。这些路径在灰度窗口内可能一次都没被请求,自然也不会暴露 404 或 410。
全量发布改变的不只是覆盖比例,还可能改变规则本身。灰度阶段常用重定向规则兜底,全量时若把规则收敛成白名单,灰度里被兜住的路径就会掉出来。所以“灰度没问题”和“全量没问题”之间隔着一层规则差异,而不是同一件事的放大。
解释一:样本偏差。灰度抽到的流量恰好避开了例外路径,死链一直存在,只是没被访问到。这种情况下,全量发布只是让原本隐藏的问题变得可见。
解释二:规则差异。灰度与全量使用了不同的重定向、路由或缓存配置,例外路径在灰度被兜住,在全量被放开。这种情况下,问题由发布动作本身引入。
两种解释指向完全不同的修复方向:前者要补的是监控与路径清单,后者要补的是配置一致性。判断错了,就会在错误的地方反复改动。
关键证据是灰度窗口内这些例外路径有没有被请求过。可以查访问日志中对应状态码的记录,再看全量发布前后同一路径的状态变化:
需要注意,请求量或抓取量归零本身不能单独证明处理正确。它也可能是爬虫调度变化、日志采样丢失或缓存命中导致的,需要和状态码、配置版本一起看。
假设某站要下线一个旧活动栏目,但其中三个页面仍有外链价值,需要保留。灰度阶段只放 5% 流量,三天内这些页面一次没被访问,监控显示无异常。全量后,未保留的页面返回 404,被外链指向的页面因为不在保留清单里也返回 404。
此时可做的动作是:先从外链工具或日志中导出仍被引用的路径,生成保留清单;再对确认退出的路径统一返回 410,对保留路径配置 301 指向新栏目。执行后复查这些路径的状态码,如果保留路径恢复 200 或 301,说明问题出在清单缺失而非规则引擎;如果仍异常,则要检查全量配置是否覆盖了灰度配置。这个结果决定下一步是补清单还是回滚配置。
要让灰度对死链处理有意义,不能只按流量比例抽样,而应主动把高风险路径纳入验证集:
站点地图不保证收录,robots.txt 的抓取限制也不等于可靠的索引移除。对于确实要退出的内容,返回 410 通常比依赖 robots.txt 更明确;对于仍有价值的路径,301 到最相关的新页面比跳到首页更有助于用户和爬虫理解关系。不同搜索引擎对这些状态的处理需要分别核查,不能假设一致。
灰度通过不等于全量安全,它只证明被抽到的那部分安全。把例外路径显式纳入灰度验证,并在全量后按同一清单复查,才能让死链处理从“没发现问题”变成“知道哪些路径被处理、哪些还需要跟进”。