前端必须要懂的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 分钟前
Web学习之用户认证
前端·学习
We་ct18 分钟前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
weixin_3954489129 分钟前
main.c_cursor_0129
前端·网络·算法
2501_9400078935 分钟前
Flutter for OpenHarmony三国杀攻略App实战 - 性能优化与最佳实践
android·flutter·性能优化
2401_859049081 小时前
git submodule update --init --recursive无法拉取解决
前端·chrome·git
这是个栗子1 小时前
【Vue代码分析】前端动态路由传参与可选参数标记:实现“添加/查看”模式的灵活路由配置
前端·javascript·vue.js
刘一说2 小时前
Vue 动态路由参数丢失问题详解:为什么 `:id` 拿不到值?
前端·javascript·vue.js
熊猫钓鱼>_>2 小时前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling2 小时前
elementPlus按需导入配置
前端·javascript·vue.js
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest