这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
一、前言
先来了解下
CDN
:阿里云CDN
CDN
(Content Delivery Network
)内容分发网络:是建立并覆盖在承载网之上,由遍布全球的边缘节点服务器群组成的分布式网络。能分担源站压力,避免网络拥塞,确保在不同区域、不同场景下加速网站内容的分发,提高资源访问速度。
CDN
厂商,他们的 CDN
服务器遍布全国各地。对于中小型企业而言,不可能在全国各地搞太多的服务器,那么完全可以把你的秒杀活动中的静态页面、js
、css
和图片都推送到 CDN
厂商的服务器上。
CDN
加速原理:
假设您的加速域名为 www.a.com
,接入 CDN
开始加速服务后,当终端用户在北京发起 HTTP
请求时,处理流程如下图所示:
-
当终端用户向
www.a.com
下的指定资源发起请求时,首先向LDNS
(本地DNS
)发起域名解析请求。 -
LDNS
检查缓存中是否有www.a.com
的IP
地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS
查询。 -
当授权
DNS
解析www.a.com
时,返回域名CNAME www.a.cdn.com
对应IP
地址。 -
域名解析请求发送至云厂商
DNS
调度系统,并为请求分配最佳节点IP
地址。 -
LDNS
获取DNS
返回的解析IP
地址。 -
用户获取解析
IP
地址。 -
用户向获取的
IP
地址发起对该资源的访问请求。- 如果该
IP
地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如图中步骤7和8,此时请求结束。 - 如果该
IP
地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后结合用户自定义配置的缓存策略,将资源缓存到CDN
节点并返回给用户,例如图中的北京节点,此时请求结束。配置缓存策略的操作方法,请参见配置缓存过期时间。
- 如果该
总结:通俗 CDN
,即距离用户所在地最近的一台机器,用户的 APP
和页面加载的时候就直接走 CDN
。
二、基于CDN
的秒杀活动静态页面缓存方案
秒杀活动静态页面一般分为两个部分:
- 数据嵌入
HTML
以后的静态HTML
页面 HTML
页面引用的js
、css
和 图片
这些资源都可以直接推送到 CDN
。
通俗
CDN
:距离用户所在地最近的一台机器,用户的APP
和页面加载的时候就直接走CDN
。
举个栗子:
- 秒杀活动页面的
nginx
有 3台,这时候有 100万 用户同时要访问秒杀活动页面,那么 100万请求都会发送到这nginx
服务器上。 - 这时候,我们买了云厂商的
CDN
服务,假设有 100 台服务器。 - 100万 用户每个人的请求都会找距离比较近的
CDN
服务器,那么每台CDN
服务器也不过就在一定的时间范围内接受了 1万次请求而已。
那么这样做的好处有:
- 利用散布在全国各地的
CDN
服务器去分散我们自己的服务器的压力,可以轻松抗下高并发的请求 - 假设公司的机房在北京,此时云南、贵州或者其他偏远的地区的用户的请求都打到北京的机房里,那速度就会比较慢。
但是如果说秒杀活动页面都分散在各个省份,即云南、贵州或者其他偏远省份都有一些
CDN
服务器,推送了页面之后,各个地方的用户就直接访问距离他们最近的CDN
服务器。 这样加载的速度也就会快很多。
回源操作:即 CDN
中资源失效,需要到原来服务器拉取最新的资源。
HTML
、js
、css
和图片都可以放在nginx
上,如果回源过来就直接拉取本地读取返回了。
CDN
静态数据缓存方案里的失效和命中问题
假设不小心修改了页面,那就需要让 CDN
快速失效缓存,然后重新推送页面过去:
- 可以配置缓存策略,例如过期时间。
- 回源服务器,也一定得存储一份数据
至于命中问题,就是要选择推送到哪些 CDN
节点:
- 如果太分散了,那么成本很高,而且失效的时候成本很高,还可能导致命中率很低,所以最好是推送到距离自己用户量最大的地区,而且保证
CDN
和公司服务器的网络要好。
1000个
CDN
服务器上都有我们的页面缓存,此时可能有很大一部分CDN
服务器并没有太多的人去访问,但是有少部分的CDN
服务器因为距离你大部分用户比较近,可能承载的压力就会比较大一些。
- 而且是缓存在
CDN
的二级缓存服务器上,那个缓存服务器容量大,集中,缓存命中率会比较高,而且数量不多,缓存失效速度也快
CDN
服务器数量不要太多,尽量都是选择在距离你大部分用户比较近的地方;万一你要失效缓存,此时CDN
服务器数量不多,失效的时候速度就会比较快一些,成本也比较低;但是都是距离用户比较集中,缓存命中率整体也高