DNS 与 CDN 在一次资源访问中如何协作?更新不生效怎么排查?

先理解原理和示例,再练习完整口述与追问。

DNS 解析可能经过多级缓存和 CNAME;CDN 选边缘节点;DNS 缓存和 HTTP 缓存不同;逐层确认命中的主机与内容版本。

浏览器需要把资源域名解析成可连接的地址,解析可能命中浏览器、操作系统、递归解析器等缓存,也可能通过 CNAME 指向 CDN 调度域名,由 CDN 根据网络和调度策略返回节点地址。建立连接后,CDN 边缘节点按缓存键查找内容,未命中时可能向上级缓存或源站回源,再根据策略缓存响应。

DNS TTL 控制解析记录缓存时间,HTTP Cache-Control 控制资源表示的缓存,它们不是同一套缓存。使用了 CDN 也不代表资源永远就近或必定命中,地区、运营商、调度、缓存键、Cookie、查询参数、Vary 和源站响应头都可能影响效果。

更新不生效时,我会先确认当前域名解析地址、实际响应服务和资源 URL,再看响应内容版本、Age、ETag、Cache-Control、Via 或供应商的命中标记,区分浏览器缓存、Service Worker、CDN 和源站问题。静态资源通常采用内容指纹和长期缓存,HTML 使用较短缓存或校验;发布时先上传新资源,再切换引用它们的 HTML,保留旧资源一段时间,避免旧页面引用已被删除的文件。不要先把所有缓存永久关闭来掩盖发布策略问题。

HTML 更新到引用 app.new.js,但某 CDN 节点还缓存旧 HTML,就仍可能加载 app.old.js;只刷新新 JS 的 CDN 缓存无法更新入口。先确认实际拿到哪版 HTML,再看 DNS 调度、CDN 命中与浏览器/Service Worker 缓存,逐层定位。

DNS TTL 与 HTTP max-age 分别控制记录与资源,不要混用。不要把不存在资源回退 HTML,使版本错误变成难解释的脚本语法异常。

浏览器需要把资源域名解析成可连接的地址,解析可能命中浏览器、操作系统、递归解析器等缓存,也可能通过 CNAME 指向 CDN 调度域名,由 CDN 根据网络和调度策略返回节点地址。建立连接后,CDN 边缘节点按缓存键查找内容,未命中时可能向上级缓存或源站回源,再根据策略缓存响应。