基于CDN静态页面缓存方案

2,173 阅读5分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

一、前言

先来了解下 CDN阿里云CDN

CDNContent Delivery Network)内容分发网络:是建立并覆盖在承载网之上,由遍布全球的边缘节点服务器群组成的分布式网络。能分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问速度。

CDN 厂商,他们的 CDN 服务器遍布全国各地。对于中小型企业而言,不可能在全国各地搞太多的服务器,那么完全可以把你的秒杀活动中的静态页面、jscss 和图片都推送到 CDN 厂商的服务器上。

CDN 加速原理:

假设您的加速域名为 www.a.com,接入 CDN 开始加速服务后,当终端用户在北京发起 HTTP 请求时,处理流程如下图所示:

2021-08-1120-01-44.png

  1. 当终端用户向 www.a.com 下的指定资源发起请求时,首先向 LDNS(本地 DNS)发起域名解析请求。

  2. LDNS 检查缓存中是否有 www.a.comIP 地址记录。如果有,则直接返回给终端用户;如果没有,则向授权 DNS 查询。

  3. 当授权 DNS 解析 www.a.com 时,返回域名 CNAME www.a.cdn.com 对应 IP 地址。

  4. 域名解析请求发送至云厂商 DNS 调度系统,并为请求分配最佳节点 IP 地址。

  5. LDNS 获取 DNS 返回的解析 IP 地址。

  6. 用户获取解析 IP 地址。

  7. 用户向获取的 IP 地址发起对该资源的访问请求。

    • 如果该 IP 地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如图中步骤7和8,此时请求结束。
    • 如果该 IP 地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后结合用户自定义配置的缓存策略,将资源缓存到 CDN 节点并返回给用户,例如图中的北京节点,此时请求结束。配置缓存策略的操作方法,请参见配置缓存过期时间。

总结:通俗 CDN,即距离用户所在地最近的一台机器,用户的 APP 和页面加载的时候就直接走 CDN



二、基于CDN的秒杀活动静态页面缓存方案

秒杀活动静态页面一般分为两个部分:

  1. 数据嵌入 HTML 以后的静态 HTML页面
  2. HTML 页面引用的 jscss 和 图片

这些资源都可以直接推送到 CDN

通俗 CDN:距离用户所在地最近的一台机器,用户的 APP 和页面加载的时候就直接走 CDN

举个栗子:

  • 秒杀活动页面的 nginx 有 3台,这时候有 100万 用户同时要访问秒杀活动页面,那么 100万请求都会发送到这 nginx 服务器上。
  • 这时候,我们买了云厂商的 CDN 服务,假设有 100 台服务器。
  • 100万 用户每个人的请求都会找距离比较近的 CDN 服务器,那么每台 CDN 服务器也不过就在一定的时间范围内接受了 1万次请求而已。

那么这样做的好处有:

  1. 利用散布在全国各地的 CDN 服务器去分散我们自己的服务器的压力,可以轻松抗下高并发的请求
  2. 假设公司的机房在北京,此时云南、贵州或者其他偏远的地区的用户的请求都打到北京的机房里,那速度就会比较慢。

但是如果说秒杀活动页面都分散在各个省份,即云南、贵州或者其他偏远省份都有一些CDN服务器,推送了页面之后,各个地方的用户就直接访问距离他们最近的CDN服务器。 这样加载的速度也就会快很多。

回源操作:即 CDN 中资源失效,需要到原来服务器拉取最新的资源。

HTMLjscss 和图片都可以放在 nginx 上,如果回源过来就直接拉取本地读取返回了。

CDN 静态数据缓存方案里的失效和命中问题

假设不小心修改了页面,那就需要让 CDN 快速失效缓存,然后重新推送页面过去:

  1. 可以配置缓存策略,例如过期时间。
  2. 回源服务器,也一定得存储一份数据

至于命中问题,就是要选择推送到哪些 CDN 节点:

  1. 如果太分散了,那么成本很高,而且失效的时候成本很高,还可能导致命中率很低,所以最好是推送到距离自己用户量最大的地区,而且保证 CDN 和公司服务器的网络要好。

1000个 CDN 服务器上都有我们的页面缓存,此时可能有很大一部分 CDN 服务器并没有太多的人去访问,但是有少部分的 CDN 服务器因为距离你大部分用户比较近,可能承载的压力就会比较大一些。

  1. 而且是缓存在 CDN 的二级缓存服务器上,那个缓存服务器容量大,集中,缓存命中率会比较高,而且数量不多,缓存失效速度也快

CDN 服务器数量不要太多,尽量都是选择在距离你大部分用户比较近的地方;万一你要失效缓存,此时 CDN 服务器数量不多,失效的时候速度就会比较快一些,成本也比较低;但是都是距离用户比较集中,缓存命中率整体也高