前端必须要懂的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的问题?欢迎留言讨论哈🤔

相关推荐
陈_杨2 分钟前
鸿蒙5开发宝藏案例分享---性能优化案例解析
前端
前端付豪5 分钟前
揭秘网易统一日志采集与故障定位平台揭秘:如何在亿级请求中1分钟定位线上异常
前端·后端·架构
香蕉可乐荷包蛋15 分钟前
vue对axios的封装和使用
前端·javascript·vue.js·axios
娃哈哈哈哈呀19 分钟前
html - <mark>标签
前端·html
QQ_hoverer19 分钟前
前端使用 preview 插件预览docx文件
前端·javascript·layui·jquery
陈随易21 分钟前
Lodash 杀手来了!es-toolkit v1.39.0 已完全兼容4年未更新的 Lodash
前端·后端·程序员
Thomas游戏开发28 分钟前
Unity3D TextMeshPro终极使用指南
前端·unity3d·游戏开发
potender29 分钟前
前端基础学习html+css+js
前端·css·学习·html·js
Hilaku38 分钟前
你以为的 Tailwind 并不高效,看看这些使用误区
前端·css·前端框架
帅夫帅夫40 分钟前
Vibe Coding从零开始教你打造一个WebLLM页面
前端·人工智能