小流量灰度能验证的只是“样本路径通不通”,不能证明全量发布后收录行为一致。当灰度只覆盖少数栏目、少量模板或部分服务器节点时,全量上线出现例外,往往不是灰度本身失败,而是灰度没有覆盖真正决定收录的变量。要判断这次例外属于哪一种,需要先分清是抓取入口差异,还是页面输出差异。
常见情形是:灰度期间抽检的页面能被抓取、能出现在结果里,于是团队认为发布方案成立。全量后却发现另一批页面长期不被处理。灰度样本成立,只能说明被抽中的那批页面在当时的条件下成立,不能推导出全量成立。两者之间至少差了三类变量:样本选择、模板分支、访问路径。
如果灰度选的是主力模板、热门栏目、权重较高的旧页面,全量里那些低频模板、深层分页、参数化列表就可能从未进入测试范围。灰度验证的是“代表性”,而代表性由抽样方式决定,不由流量比例决定。百分之一的小流量如果恰好避开了例外分支,结论就是偏的。
第一种解释是抓取入口差异。灰度期间可能只放开了部分路径被抓取,或者内链、站点地图、分页入口只指向灰度页面。全量后入口结构变化,抓取分配随之改变,原本能到达的页面变得难以到达。这种例外的特征是:页面本身内容没变,变化发生在“怎么被发现”这一层。
第二种解释是页面输出差异。灰度与全量使用了不同的模板分支、不同的渲染条件、不同的缓存策略或不同的字段拼装逻辑,导致全量页面在可见内容、状态码、规范化标签或链接结构上与灰度样本不一致。这种例外的特征是:入口没变,变化发生在“返回了什么”这一层。
两种解释会导向完全不同的动作。若误判为抓取问题而反复提交入口,页面输出层面的缺陷不会消失;若误判为输出问题而回滚模板,入口结构的收缩也不会自动恢复。
先取一组全量后出现例外的页面,再取一组灰度期间正常的同类页面,做同条件对照。可用的区分证据包括:
如果两组页面的响应结构一致,只有入链和层级不同,更接近抓取入口解释;如果入链结构相同而响应内容、状态码或规范化标签不同,更接近页面输出解释。若两者都不同,说明灰度同时遗漏了两类变量,需要先固定其中一类再复测。
假设某站点灰度只覆盖首页模板和两个主栏目,全量后新增了带筛选参数的列表页。灰度期间这些列表页不存在,因此没有被抓取记录。全量后它们出现,但页面依赖前端脚本渲染,服务端返回的初始 HTML 中只有空容器。此时抽检首页仍正常,例外却集中在列表页。
这个例子里,灰度没有覆盖到“新增页面类型”这一变量。要验证,可以先对同一批列表页关闭脚本渲染,检查服务端返回内容是否包含可读文本与链接;若为空,则例外来自输出层,而非抓取入口。这个判断会直接改变下一步:输出层问题应先修渲染或改为服务端输出,而不是继续追加提交入口。
要让灰度具备暴露例外的能力,抽样必须按“模板分支 + 页面类型 + 入口层级”分层,而不是按流量比例随机抽取。每一类即将在全量中出现的新页面,都应在灰度中有至少一个可被抓取的代表。若某类页面在灰度阶段尚不存在,就不能把它算作已验证。
同时要记录灰度与全量的差异清单:模板版本、缓存策略、入口来源、参数规则。发布后出现例外时,先对照这份清单定位差异层,再决定是回滚输出还是补入口。robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这两点在全量发布后同样成立,不能作为灰度结论的替代证据。
一次灰度能证明的是被覆盖路径成立,不能证明未覆盖路径成立。把灰度当作全量的缩小版,而不是当作模板分支的抽样检查,才是这类例外反复出现的根源。