# CDN访问流程及刷新预热
内容分发网络(Content Delivery Network),是在现有 Internet 中增加的一层新的网络架构,由遍布全国的高性能加速节点构成。这些高性能的服务节点都会按照一定的缓存策略存储您的业务内容,当您的用户向您的某一业务内容发起请求时,请求会被调度至最接近用户的服务节点,直接由服务节点快速响应,有效降低用户访问延迟,提升可用性.
# 加速原理
假设您的业务源站域名为 www.test.com
,域名接入 CDN 开始使用加速服务后,当您的用户发起 HTTP 请求时,实际的处理流程如下图所示:
详细说明如下:
当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS 系统会最终将域名的解析权交给 CNAME (opens new window) 指向的 CDN 专用 DNS 服务器。
CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回用户。
用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。
CDN 全局负载均衡设备根据用户 IP 地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
基于以下这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址:
根据用户 IP 地址,判断哪一台服务器距用户最近;
根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;
查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。
全局负载均衡设备把服务器的 IP 地址返回给用户。
用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
DNS 服务器根据用户 IP 地址,将域名解析成相应节点的缓存服务器IP地址,实现用户就近访问。使用 CDN 服务的网站,只需将其域名解析权交给 CDN 的全局负载均衡(GSLB)设备,将需要分发的内容注入 CDN,就可以实现内容加速了。
# 缓存设置
第一,缓存的设置,max-age 我们都用过,在 Cache-Control 中经常用于缓存的控制,可是 max-age 设置的缓存会应用于一个请求经过的每一级,如果我们希望 CDN 不缓存那么久,要怎么办呢?那就是 s-maxage,它用于设置代理服务器的缓存时间,会覆盖 max-age 的设置,这样我们可以把 max-age 用于本地缓存,把 s-maxage 用于 CDN 缓存时间,避免脏数据的产生。
# 判断是否命中缓存
无论是我们自己在开发过程中,还是帮客户 debug 的过程中,我们都会考虑一件事——这个资源是否命中了CDN,是否是因为CDN导致的问题,这个时候就要秀一波操作了。
在各大厂商的 CDN 返回的数据中都会有一个 X-Cache,上面内容是 Hit 或者 Miss,还会加上诸如 Memory 或者 Disk 的缩写表示内存还是磁盘,如果出现 Upstream 或者 Miss 则表示没有命中
# CDN预热
我们知道将资源部署到CDN之后,当首批用户访问时并不能及时的在就近的节点上拉取对应的资源,所以通常我们需要对CDN进行预热。
预热功能是指提交URL预热请求后,源站将会主动将对应的资源缓存到全站加速节点,当您首次请求时,就能直接从全站加速节点缓存中获取到最新的请求资源,无需再回源站获取。预热功能会提高缓存命中率。
预热的操作步骤一般是在云服务厂商上面配置对应哪些url进行预热,为什么不使用目录预热呢,其主要原因是没法知道目录下面的那些资源需要预热。
一个例子:
# CDN刷新
内容分发网络(CDN)提供基础缓存配置能力,可根据指定业务类型、目录、具体 URL 等各类规则设置缓存过期时间,来达到定期清理节点缓存资源,回源站重新拉取最新资源重新缓存的目的。
除此之外,CDN 提供了缓存刷新的能力,可批量指定 URL 或目录进行刷新操作:
刷新 URL:源站有少量文件更新时,可以使用 URL 刷新 来主动删除 CDN 节点上的资源文件。新的请求进来时,CDN 节点会回源获取文件并将新的资源文件缓存至 CDN 节点,所以这是一个主动更新的过程
刷新目录:选择 “刷新变更资源” 模式,当用户访问匹配目录下资源时,会回源获取资源的 Last-Modify 信息,若与当前缓存资源一致,则直接返回已缓存资源,若不一致,回源拉取资源并重新缓存;选择 “刷新全部资源” 时,当用户访问匹配目录下资源时,直接回源拉取新资源返回给用户,并重新缓存新资源
TIP
说明: 刷新成功执行后,节点上对应资源无有效缓存,当用户再次发起访问时,节点回源站拉取所需资源,并重新缓存在节点上。因此提交大量的刷新任务,会清空较多缓存,从而导致回源请求突增,源站会产生较大压力。
- 本文链接: https://mrgaogang.github.io/javascript/CDN%E8%AE%BF%E9%97%AE%E6%B5%81%E7%A8%8B%E5%8F%8A%E5%88%B7%E6%96%B0%E9%A2%84%E7%83%AD.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!