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

相关推荐
Highcharts.js7 小时前
甘特图纵向任务、横向时间显示图表可视化开发|Highcharts甘特图示例
开发语言·前端·javascript·可视化·甘特图·数据可视化·highcharts
yume_sibai7 小时前
Element Plus 导航与反馈组件完全指南(15个核心组件)
前端·elementui·交互
susplus7 小时前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
可乐鸡翅yeah_7 小时前
hls.js 多实例并发踩坑,多视频页面播放器内存与冲突问题解决
开发语言·前端·javascript·音视频·hls·m3u8·m3u8在线播放
涛涛ing8 小时前
你的页面为什么总是卡成PPT?2026年,90%的前端都忽略了主线程
前端
SoaringHeart8 小时前
Flutter 进阶 | 组件封装:用 CustomPainter 实现光环动画组件AnimatedHalo
前端·flutter
IT_陈寒8 小时前
JavaScript的隐式转换太坑了,我的==比较怎么就炸了?
前端·人工智能·后端
xieliyu.8 小时前
计算机网络:Fiddler 抓包工具使用教程 + HTTP 协议报文格式详解
java·笔记·计算机网络·测试工具·http·java-ee·fiddler
雪芽蓝域zzs8 小时前
第十四节:后端返回权限动态路由
前端·javascript·vue.js
Rain5098 小时前
谁动了我的 URL?——记一次微前端“灵异 Bug“的排查实录
前端·vue.js·人工智能·前端框架·bug·ai编程