因为灰度只覆盖了“被选中的那部分入口”,而全量发布改变的是入口的分布、链接层级和抓取预算的竞争关系。灰度期间收录频率正常,只能说明被抽中的样本在当时的抓取路径下没有异常;全量之后新出现的入口类型、模板分支和参数组合,可能从未进入过灰度样本,于是例外在放量后才第一次被触发。判断该不该扩大灰度,取决于你能不能让灰度样本覆盖“入口类型”而不是“流量比例”。
两种做法都常见,但代价完全不同。
按流量比例抽。把 5% 的访问随机导向新版本,其余走旧版本。它适合验证渲染性能、错误率和转化路径,因为随机抽样对这类指标的代表性较好。但它对收录频率的验证很弱:如果新版本只在某个栏目模板或某类详情页上产生不同的链接输出,随机 5% 很可能根本没抽到那个模板,或者抽到了但数量太少,日志里看不出抓取行为的变化。
按入口类型抽。先列出这次发布新增或改变的入口类型,例如新的分页写法、新的筛选参数、新的关联推荐模块、新的结构化数据输出,然后每一类都强制放一小批页面进灰度,哪怕总量远低于 5%。它适合验证抓取与收录相关的行为,代价是需要提前知道“哪些入口变了”,而这恰恰是很多发布流程里没人负责梳理的部分。
选择依据可以简化成一句话:如果这次发布改动了链接输出、URL 生成规则或页面可见内容的结构,就按入口类型抽;如果只改了样式、接口性能或后端逻辑,按流量比例抽通常够用。选错的代价是灰度通过但全量翻车,而且翻车信号往往延迟出现,因为抓取和收录本来就不是即时反馈。
只记录“灰度期间没有报错”不足以支撑放量决策。要让灰度结果对全量有预测力,至少固定三组对照:
一个假设例子:某次发布把列表页的“下一页”从静态路径改成带 ?page= 参数的地址,灰度只抽了首页和两个热门栏目。这两个栏目的分页链接本来就被频繁抓取,参数化后仍被跟进,于是灰度显示正常。全量后,长尾栏目的大量分页第一次以参数形式出现,抓取端对这些新参数地址的跟进明显变慢,收录频率在长尾部分下降。这个例子里,灰度样本恰好落在“抓取优先级最高”的位置,掩盖了长尾的例外。
可执行的动作是:在灰度阶段就把日志按入口类型分组统计,而不是按全站汇总。分组之后如果发现某一类的抓取 URL 形态与旧版本不一致,下一步不是直接放量,而是先确认这种不一致是预期的,还是模板分支写错了。
灰度覆盖不到的例外通常来自三类变化:
这三类的共同点是:它们和“流量大小”无关,和“入口与数据的组合是否出现”有关。所以扩大灰度流量比例往往解决不了问题,扩大入口类型的覆盖才有用。
放量前应满足的条件是:灰度样本已经覆盖本次发布涉及的每一种入口类型,并且每一类都有新旧版本的抓取 URL 形态对照。如果某个入口类型在灰度中样本过少,无法形成对照,那么对这类入口单独再做一次定向灰度,比整体推迟发布更省时间。
放量后如果收录频率出现异常,处理顺序建议是:
需要提醒的是,抓取量或收录量在某个时间窗内下降,不能单独证明是这次发布造成的。抓取调度本身有波动,外部链接变化、站点整体响应速度、以及抓取端对站点的重新评估,都可能产生类似现象。要把它归因到发布,需要的是同一入口类型在新旧版本之间的对照差异,而不是一条全站曲线。
另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。灰度阶段如果用这两者来“控制样本”,得到的结论不能直接外推到全量,因为限制抓取和阻止索引是两件事,站点地图只是提示而非承诺。
要让下一次发布不再重复同样的例外,可以把灰度结论固化成一条发布条件:本次发布若改动了链接输出、URL 生成规则或渲染后的可见内容结构,灰度必须按入口类型覆盖,并在放量前提供每一类的新旧抓取 URL 形态对照。不满足这条时,放量的代价就是例外只能在全量后被发现,而那时定位成本已经包含了线上流量的影响面。
这条条件的实际作用是改变下一步:它把“灰度没报错就放量”变成“灰度没覆盖到的入口类型要么补测、要么明确接受风险”。接受风险也是一种决策,但前提是知道风险落在哪一类入口上,而不是等全量之后从汇总曲线里反推。