先给结论:当同一URL在不同节点返回不同版本时,不要急着清全部缓存或提交删除,而要先判断这是“版本发布顺序不一致”还是“缓存键设计漏掉了区分维度”。前者会随各层过期时间收敛,后者会长期随机复现。区分二者的关键证据是:同一请求头组合反复命中同一旧版本,还是同一节点在不同请求头下返回不同版本。
多层缓存通常包括CDN边缘、反向代理、应用层对象缓存,以及Google自己的抓取缓存。定位一致性问题的第一步,是让请求可复现:固定URL、固定请求头(尤其是Accept-Language、User-Agent、Cookie是否参与缓存键)、固定查询串,然后从不同网络位置和不同节点重复请求同一路径。
实际动作:用curl -I或等效方式记录每层返回的状态码、Age、ETag、Last-Modified、Cache-Control和Vary。如果边缘节点返回的Age很小、源站返回的ETag却与上次不同,说明问题更可能出在回源路径而非边缘本身。这个动作的结果会直接决定下一步:是继续往上游查,还是先修正缓存键。
假设内容已更新,但CDN的TTL是1小时,反向代理是10分钟,应用缓存是5分钟。在更新后的前10分钟,不同节点可能分别返回旧版本、新版本和混合版本。这种不一致的特征是:随时间推移,旧版本命中率单调下降,最终所有节点收敛到同一版本。
可区分证据:在多个时间点重复同一请求,记录旧版本出现的节点集合。如果旧版本节点集合逐步缩小,且缩小节奏与各层TTL吻合,基本可判定为发布顺序问题。此时不需要改代码,只需确认各层TTL与发布流程的先后关系,必要时让发布流程先失效上游再失效下游,而不是反过来。
另一种情况是缓存键只用了URL,没有把影响输出的维度纳入键,例如语言、设备类型、登录状态或实验分组。结果是A条件下生成的旧版本被缓存后,被B条件的请求命中。这种不一致的特征是:同一节点在不同请求头下返回不同版本,且旧版本不会随时间自然消失。
可区分证据:对同一URL发送两组仅在一个请求头上不同的请求,观察返回的Vary和实际内容。如果响应体随请求头变化但Vary未声明该头,或声明了但边缘未按此分键,就属于缓存键问题。此时清缓存只能短暂缓解,下一次请求仍会重新污染。正确动作是补齐Vary或在缓存键中加入该维度,然后重新验证同一组请求是否稳定返回同一版本。
当旧内容、旧系统或旧合作关系需要退出时,一致性问题的处理目标不是“所有节点立刻只剩新版本”,而是“仍然有价值的部分不被误删,已废弃的部分不再被复用”。建议先列出仍需保留的路径和参数组合,再对废弃部分做明确的失效处理。
410或404并配合缓存失效,而不是仅靠robots.txt限制抓取。robots.txt的抓取限制不等于可靠的索引移除。这个动作的结果会影响后续判断:如果拆分后旧版本只在废弃路径出现,说明退出策略生效;如果旧版本仍出现在保留路径,说明缓存键或上游数据源还有未处理的依赖。
假设一个页面同时存在中文和英文版本,缓存键只用了URL。修复前,中文请求可能命中英文旧版本;修复后,同一URL在两组请求头下应返回各自语言版本,且Vary声明了语言维度。这里的数字仅用于说明比较方法:修复前记录10次请求中旧版本出现次数,修复后在相同节点、相同时间窗口内重复同样次数,观察旧版本是否降为0。若未降为0,需检查是否还有上游缓存未同步失效。
需要说明的是,请求量或抓取量归零并不能单独证明处理正确,它也可能是抓取预算转移、路径被屏蔽或上游超时导致的。站点地图不保证收录,HTTPS也不保证安全无漏洞或排名。定位一致性问题的核心始终是:固定请求、比较各层返回、区分发布顺序与缓存键两类原因,再决定是等待收敛还是修正分键。完成这一步后,下一步才是评估是否需要向Google提交更新或移除请求。