fe-notes icon indicating copy to clipboard operation
fe-notes copied to clipboard

CDN 缓存机制和回源策略

Open Inchill opened this issue 3 years ago • 0 comments

CDN 工作概述

客户端先检查本地是否有缓存以及缓存是否过期,如果过期,则像 CDN 边缘节点发起请求。CDN 边缘节点会检查用户请求数据的缓存是否过期,如果没有过期,直接响应用户的请求,完成一次 http 请求和响应。如果 CDN 缓存数据过期,那么还需要向源站发送回源请求(back to the source request),来拉取最新的数据。

CDN 的典型拓扑图如下:

CDN 层级划分

  • 边缘层:CDN 中直接面向用户,负责给用户提供内容服务的 cache 设备直接部署在整个 CDN 网络的边缘位置。
  • 中心层:负责全局的管理和控制,同时也拥有最多的 cache。在边缘层设备没有命中 cache 时,会向中心层设备请求;而中心层未能命中则会向源站请求。
  • 区域层:如果 CDN 系统非常庞大,边缘层向中心层请求太多,会造成中心层负载压力过大。此时会在边缘层和中心层之间添加一层区域层,负责一个区域的管理和控制。

CDN 缓存策略

CDN 边缘节点缓存策略因服务商不同而不同,但一般都会遵循 http 标准协议,通过 http 响应头中的 Cache-control: max-age 的字段来设置 CDN 边缘节点数据缓存时间。

当客户端向 CDN 节点请求数据时,CDN 节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN 节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。

CDN 服务商一般会提供基于文件后缀、目录多个维度来指定 CDN 缓存时间,为用户提供更精细化的缓存管理。

CDN 缓存时间会对“回源率”产生直接的影响。若 CDN 缓存时间较短,CDN 边缘节点上的数据会经常失效,导致频繁回源,增加了源站的负载,同时也增大的访问延时;若 CDN 缓存时间太长,会带来数据更新时间慢的问题。开发者需要增对特定的业务,来做特定的数据缓存时间管理。

CDN 缓存刷新

CDN 边缘节点对开发者是透明的,相比于浏览器的强制刷新来使浏览器本地缓存失效,开发者可以通过 CDN 服务商提供的“刷新缓存”接口来达到清理 CDN 边缘节点缓存的目的。这样开发者在更新数据后,可以使用“刷新缓存”功能来强制 CDN 节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据。

CDN 缓存缺点

CDN 的分流不仅减少了用户的访问延时,也减少了源站的负载压力。但是缺点很明显,当源站数据更新时,如果 CDN 节点过多没有及时更新,那么用户访问到的还是过期的资源,涉及到 js 的脚本资源很可能会导致用户访问异常。

CDN 优点

  • 提升网站加载性能,这个是作为前端开发第一时间会想到的。
  • 实现跨运营商、跨地域的全网覆盖。比如国际化站点不同的语言包存放于不同的 CDN 节点,而不同的 CDN 节点服务运营商不同。
  • 保障网站安全。正所谓不能把鸡蛋放入一个篮子里,网站的不同资源部署在不同的 CDN 服务器上,无形中增加了网络攻击的成本。
  • 便于容灾。当某个 CDN 节点服务发生故障时,将会由其它 CDN 节点继续提供服务,而且在修复故障机器时,可以从源站获取到备份资源。
  • 让研发专注于业务本身。

当 CDN 挂了怎么办

CDN 如果挂了,应用就会受到影响,所以可以通过启用本地资源的方式来作为兜底策略。代码实现如下:

<script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

一般而言一个网站的资源存放于不同的域名,可以把本地资源路径替换为主域地址。可以阅读当CDN主域挂了该如何应对(前端网站容灾方案)

Inchill avatar Aug 11 '22 11:08 Inchill