小流量灰度之所以能暴露全量发布的例外,是因为它把“大部分页面正常”与“少数页面被排除”同时摆到台面上:灰度样本里只要有一类模板、参数或状态码被区别对待,全量发布就会把这个差异放大成一批页面不被收录。判断该不该扩大灰度,取决于例外是否可归因到模板或发布流程,而不是取决于灰度样本里收录数量的多少。
小流量灰度通常只放出少量页面,但正是这种小样本让例外更容易被看见。你要找的不是“收录了多少”,而是同一批发布中,是否存在条件相同却结果不同的页面。
可区分的证据有三类:
如果灰度样本里所有页面表现一致,例外可能被样本量掩盖;此时扩大灰度比直接全量发布更稳妥。反之,如果已经出现同批不同命,就应该先定位到具体模板或入口,再决定是否继续放量。
条件一:例外集中在某一类模板,且该模板在灰度前就存在。此时优先修模板,而不是回退整次发布。动作是把该类模板的 URL 单独放进灰度,修正后再观察同一批 URL 的抓取结果。这个动作的结果会直接影响下一步:如果修正后同类 URL 表现一致,说明例外来自模板;如果仍不一致,说明还有发布流程之外的条件在起作用。
条件二:例外出现在灰度之后新增的发布环节,例如构建时批量改写了链接或注入了参数。此时优先回退该发布环节,而不是继续修模板。动作是保留灰度样本、回退发布脚本,再重新放出一小批相同 URL。若回退后例外消失,说明问题在发布环节;若例外仍在,说明需要回到模板层继续排查。
两种选择的分界不是“哪个更严重”,而是例外能否被灰度样本稳定复现。能稳定复现的,先修对应层;不能稳定复现的,先回退发布,避免把不确定的例外带到全量。
很多团队在灰度时只看收录数量,全量后却无法解释为什么某些页面被排除。要让灰度结果可归因,至少记录以下三项:
记录完成后,先核对一个容易误判的点:robots.txt 的抓取限制不等于可靠的索引移除。也就是说,即使灰度期间用 robots.txt 挡住了某类 URL,也不代表这些 URL 会从索引中消失;反过来,解除限制也不保证它们立刻被收录。站点地图同样不保证收录,它只帮助发现,不决定索引结果。把这些当作“已处理”会掩盖真正的例外。
假设某站点有 1 万个详情页,灰度放出 100 个,其中 95 个在几天内被抓取,5 个没有。团队认为 5% 属于正常波动,直接全量发布。全量后,未被抓取的页面按同样比例放大到约 500 个。
这个例子里的数字只用于说明比较方法,不代表真实比例。关键动作是:在灰度阶段把未被抓取的 5 个 URL 单独列出,检查它们是否共享同一入口或同一参数。如果共享,说明例外有结构性原因,全量前应先处理;如果不共享,且灰度期间没有发布变更,才可以把它们视为样本噪声,继续放量并保留观察窗口。
这个动作的结果会改变下一步:发现结构性原因时,先修入口或参数规则,再重新灰度同一批 URL;没有结构性原因时,全量发布后继续按同一批 URL 跟踪,而不是只看总量。
灰度结束不等于例外处理结束。全量发布后,把灰度期间表现异常的 URL 单独保留一份清单,按模板、入口和状态码分组,继续跟踪它们在全量环境下的抓取与索引结果。这样做的目的不是追求全部收录,而是确认例外是否被放大、是否与灰度阶段的判断一致。
如果全量后例外没有扩大,说明灰度阶段的归因成立,可以按正常节奏继续发布;如果例外扩大,说明灰度样本没有覆盖到某个条件,此时应回到灰度阶段重新设计样本,而不是在全量环境里逐页修补。HTTPS 不保证安全无漏洞或排名,也不构成收录的充分条件,因此不要把协议层当作例外消失的原因。不同搜索引擎对同一批 URL 的支持情况须分别核查,灰度结论只对已验证的那一个环境成立。