先给结论:把域名注册相关的解析结果、CDN缓存、源站响应和浏览器本地缓存按“同一请求标识”逐层比对,而不是只看某一层是否命中缓存。哪一层先出现版本分叉,问题就优先锁定在那一层及其上游。下面用一个明确标注为假设的情境,把决策过程拆开。
假设你为一个已注册域名配置了 CDN,源站会按部署版本输出带版本标记的 HTML。小流量抽查时,所有节点都返回新版本;流量上来后,部分用户仍看到旧版本,另一些用户看到新版本,刷新几次可能互换。这个“个别样本成立、规模化后出现例外”的现象,通常不是域名注册本身出错,而是多层缓存对同一资源的版本判定不一致。
此时不要先改 DNS,也不要先清空全部缓存。先确认三个事实:旧版本和新版本各自的响应头是否带不同的缓存标识;返回旧版本的请求是否集中在特定地区、特定运营商或特定 CDN 节点;源站直接访问时是否已经稳定输出新版本。只有这三项都清楚,才能判断是缓存层级问题还是源站发布问题。
多层缓存包括浏览器缓存、CDN 边缘节点、CDN 中间层(若启用)和源站反向代理缓存。定位一致性问题的关键,是让同一个请求在每层都留下可对比的痕迹。可以给请求加一个自定义查询参数或请求头作为标记,例如 ?debug=ver-a,并让源站在响应头中回显该标记和实际输出的版本号。
实际操作顺序如下:
这个动作的结果会直接影响下一步:如果源站稳定、CDN 各节点版本不一致,问题在 CDN 缓存键或缓存刷新策略;如果源站就返回两个版本,问题在发布流程或源站多实例之间的数据同步。
很多“不同版本”并不是缓存没刷新,而是缓存键把本应视为同一资源的请求拆成了多个副本。常见分叉点包括:是否把查询参数纳入缓存键、是否区分 HTTP 与 HTTPS、是否把 Vary 头设置得过宽、是否按设备类型或语言分别缓存。只要缓存键不同,同一 URL 就可能长期并存多个版本,且各自独立过期。
判断方法很直接:对比返回旧版本和新版本的请求,看它们的完整 URL、请求头和 CDN 缓存键是否一致。若缓存键不同,先统一缓存键规则,再决定是否需要刷新。若缓存键相同但版本仍不同,才考虑中间层或节点间同步延迟。
确认分叉层之后,处理方式有两条路,适用条件不同。
选择哪条路,取决于旧版本是否还在被主动引用、源站能否承受集中回源、以及业务是否允许短暂双版本并存。若源站回源能力有限,优先版本化 URL;若只是少量节点滞后且源站余量充足,优先定向刷新。
小样本正常、规模化异常,往往说明抽样没有覆盖真实分布。域名注册后接入 CDN 的场景里,不同地区、不同运营商、不同接入协议可能落到不同节点组,而小样本通常只覆盖了其中一两条路径。此时应扩大抽样维度,而不是重复请求同一路径。
具体动作:按地区、运营商、协议和节点分组各取若干请求,记录版本号和缓存状态。若某一组集中返回旧版本,问题范围就缩小到该组对应的节点或回源链路;若各组都随机出现两个版本,问题更可能在源站多实例或缓存键规则。这个分组结果决定了你是去修节点配置、修回源策略,还是修发布流程。
需要提醒的是,抓取量或请求量归零、某个节点暂时返回一致版本,都不能单独证明问题已解决。回源失败、节点被临时摘除、请求被限流,都可能造成“看起来一致”的假象。确认修复应同时满足:源站稳定输出单一版本、各抽样组版本一致、且持续观察一段时间后不再出现分叉。