浏览器系列 — CDN缓存

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存,因为浏览器缓存始终只是为了提升二次访问的速度,对于首次访问的加速,我们需要从网络层面进行优化,最常见的手段就是CDN加速通过将静态资源(例如javascript,css,图片等等)缓存到离用户很近的相同网络运营商的CDN节点上,即CDN缓存

不同于浏览器缓存,CDN缓存是一种服务端缓存

CDN 加速的原理

image.png

  1. 内容源(可以理解为服务器所在地)在国内某个省份内,但用户来自全国各地
  2. CDN服务商在全国各个省份部署CDN节点
  3. 在一个地区内只要有一个用户先加载资源
  4. CDN通过将静态资源(例如javascript,css,图片等等)缓存到离用户很近的相同网络运营商的CDN节点上,即CDN缓存
  5. 该地区内的其他所有用户访问资源时,就会访问到离自己最近的相同网络线路上的CDN节点
  6. 当请求达到CDN节点后,节点会判断自己的内容缓存是否有效
  7. 如果有效,则立即响应缓存内容给用户,从而加快响应速度
  8. 如果CDN节点的缓存失效,它会根据服务配置去我们的内容源服务器获取最新的资源响应给用户,并将内容再次缓存下来以便响应给后续访问的用户

CDN访问资源流程图

image.png

如何配置

整体来说,和浏览器缓存配置保持同步即可
image.png
值得注意的是:

  • 浏览器缓存是按照TCP头部规则进行自己的缓存处理
  • CDN缓存是由CDN服务商来负责缓存控制的,二者不会互相冲突

问题出现

问题场景:如果我们浏览器缓存设置cache-control: max-age=600,即缓存10分钟,但CDN缓存配置中设置文件缓存时间为1小时,此时如果服务器资源更新了,那如果资源在被访问后第12分钟修改并上传到服务器,用户重新访问资源,响应码会是304,拿不到最新资源一个小时后再次访问才能更新为最新资源

用户访问资源全过程

image.png

  1. 当用户访问我们的业务服务器时,首先进行的就是http缓存处理
  2. 如果http缓存通过校验,则直接响应给用户
  3. 如果未通过校验,则继续进行cdn缓存的处理,cdn缓存处理完成后返回给客户端,由客户端进行http缓存规则存储并响应给用户。
  4. CDN节点每隔一段时间就会去服务器请求最新资源,这段时间是由CDN服务商决定的

解决问题

  1. 我们可以和CDN服务商商讨一下把CDN缓存有效时间缩短到跟浏览器缓存一致
  2. 或者在浏览器缓存失效时使用CDN服务商提供的强制更新功能,使得CDN缓存得到更新
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享