明明清除了缓存,浏览器还设置了 disable cache
,但拿到的还是被缓存的资源!!!
背景
对于前端而言,在日常工作中,CDN导致的问题是相对较难排查的。单纯从代码层面而言的确没有问题、而且自己访问也都正常,始终无法复现。比如有用户访问白屏、部分功能不可用、没有访问到最新的内容、某个区域的用户批量不可访问
等。
而这些问题又实实在在反馈到了前端页面,作为前端硬着头皮都得排查到底。
遇到这些问题我们该如何处理了,为此做了一些梳理、总结以供大家参考。
CDN加速原理
CDN加速其实就是依靠缓存和就近访问来实现的。
其一:将源站的内容分发至多个节点,用户可以就近获取所需内容。
其二:结合CDN缓存机制,快速返回用户所需内容
当然也可以有更进一步的优化,如同时增加负载均衡(避免CDN单个服务器负载过大)、传输数据压缩(进一步缩短传输时间)、路由优化(通过优化网络路由、选择最佳路径将内容传输给用户)等
缓存资源
当用户请求访问过的资源时,可以直接从(就近的边缘节点)缓存中获取,无需再次从源站获取,从而减少了延迟、节省了带宽。
简单的缓存和获取CDN资源(当然这并没有画出浏览器缓存检查的过程、以便更好的理解),如下:
但在使用CDN缓存时,需要注意一下几点:
对响应头的控制:
通过合理设置HTTP响应头,如ETag、Cache-Control等,可以控制浏览器和CDN如何缓存资源。
注:一般在服务商后台有相关的可视化配置
缓存失效、缓存同步:
当源站资源更新或者被删除时,需要让CDN知道这个资源的缓存已经失效,以便CDN可以从源服务器拉取新的资源。一般我们可以通过CDN提供的API来实现。
缓存策略:
CDN通常提供多种缓存策略,例如根据文件类型、URL路径、URL的search参数等设置不同的缓存规则。设置好缓存策略,可以帮助我们更有效地利用CDN缓存。(在服务商后台有相关的可视化配置)
缓存过期、清除CDN缓存:
在CDN服务商一般都支持缓存设置、重刷CDN缓存等操作,如设置ETag协商缓存、通过Cache-Control设置某个时间段的强制缓存、通过不同类型设置不同的缓存策略。
整体而言就是http缓存的问题,可以参考码窝酱
的这篇文章:juejin.cn/post/702131...
其它清除CDN缓存的方式:
- Windows用户可以打开命令提示符并输入
ipconfig /flushdns
。 - macOS用户可以打开终端并输入
sudo killall -HUP mDNSResponder
。
就近访问
开启全球加速后,用户可以就近访问最接近自己的边缘节点,减少了网络传输的距离,从低大幅减少访问延迟。
CDN在客户端的常见问题
问题一:《缩略图问题》
第一次展示缩略图(万象优图)后被缓存,再点击预览原图时拿到的还是缩略图。原因是:cdn缓存策略,可以在服务商(腾讯、阿里等)后台针对缓存策略做调整。
问题二:《发版问题》
明明发了版但客户端没有更新。原因是:文件名不变但是内容变了,此时客户端使用的还是CDN缓存,需要在服务商后台强刷CDN才性(事实上可以使用cdn ETag等设置http协商缓存吧?)
问题三:《CDN节点的问题》
可以通过CDN节点测试来排查是不是节点的问题(ps:也有可能网站被恶意举报、导致被运营商封)
问题四:《境外用户出现无法访问的情况》
将原链接改为全球加速的CDN链接后正常
问题五:《页面无法访问(个别用户反馈)》
即使通过埋点反馈是CDN资源加载失败,大概率也不是CDN问题。之前遇到过用户始终无法访问某功能,尝试了多个浏览器都有同样的问题。排查元素是多个浏览器都安装了block插件,其默认的规则刚好匹配到了CDN资源,导致资源加载失败。😂
问题六:CDN缓存过期导致的问题
拉取到的不是最新的资源,导致用户功能和实际不符
结语
总的来说,虽然CDN能加速访问、减轻源服务器压力、增强应用的稳定性和可用性、以及具备容灾安全防护等优点。
但也有些确定,如成本费用相对较高、过渡依赖第三方、有的可能配置较复杂、还有缓存不更新或更新延迟等问题,另外在相关问题排查时也有一点的难度(ps:一般通过埋点等手段上报CDN加载情况)。只有正确合理的配置使用CDN,才能更好的优化网站性能。
你有遇到过哪些CDN的问题?欢迎留言讨论哈🤔