前端必须要懂的cdn缓存、加速原理

明明清除了缓存,浏览器还设置了 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的问题?欢迎留言讨论哈🤔

相关推荐
我要洋人死1 小时前
导航栏及下拉菜单的实现
前端·css·css3
‍。。。1 小时前
使用Rust实现http/https正向代理
http·https·rust
科技探秘人1 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人1 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR1 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
q2498596931 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai2 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书
Gavin_9152 小时前
【JavaScript】模块化开发
前端·javascript·vue.js
懒大王爱吃狼3 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍