缓存服务器响应用户请求,将用户所需内容传送给用户。如果这台缓存服务器上没有用户想要的内容,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器,将内容拉到本地。
CDN 缓存内容保质期长的日用品因为不容易过期,因此比较容易缓存。同样的,互联网中的静态页面、图片等,几乎不怎么改变,所以也适合缓存。而像生鲜之类的保存时间较短的,对应互联网中的动态资源,就需要用到动态 CDN 。
静态资源缓存还记得上图这个接入层缓存的架构吗?在进入数据中心的时候,我们希望通过最外层接入层的缓存,将大部分静态资源的访问拦在边缘。而 CDN 则更进一步,将这些静态资源缓存到离用户更近的数据中心外。总体来说,就是缩短用户的“访问距离”。离客户越近,客户访问性能越好,时延越低。
流媒体 CDN在静态内容中,流媒体也大量使用了 CDN。
CDN 支持流媒体协议。例如前面讲过的 RTMP 协议。在很多情况下,这相当于一个代理,从上一级缓存读取内容,转发给用户。由于流媒体往往是连续的,因而可以进行预先缓存的策略,也可以预先推送到用户的客户端。
对于静态页面来讲,内容的分发往往采取拉取的方式。也即,当发现缓存未命中的是,再去上一级进行拉取。
这个方式对于流媒体就不合适了。流媒体数据量大,如果出现回源,压力会比较大,所以往往采取主动推送的模式,将热点数据主动推送到边缘节点。
对于流媒体来讲,很多 CDN 还提供预处理服务。也就是在文件分发之前,进行一定的处理。例如将视频转换成不同的码流,以适应不同的网络带宽的用户需求。再如对视频进行分片,降低存储压力,也使得客户端可以选择使用不同的码率加载不同的分片。这就是我们常见的,超清、标清、流畅等。
除此之外,流媒体 CDN 还有个关键的防盗链问题。因为视频要花大价钱买版权,如果流媒体被其他网站盗走,在其他网站的播放,那损失就大了。
对于防盗链问题,最常用也最简单的方法就是利用 HTTP 头的 refer 字段。当浏览器发送请求的时候,一般会带上 refer。告诉服务器是从哪个页面链接过来的,服务器基于此可以获得一些信息用于处理。如果 refer 信息不是来自本站,就阻止访问或者跳到其它链接。
refer 的机制相对比较容易破解,所以还需要其它的机制配合。
一种常用的机制是时间戳防盗链。使用 CDN 的管理员可以在配置界面上,和 CDN 厂商约定一个加密字符串。
客户端访问时,取出当前的时间戳、要访问的资源极其路径,联通加密字符串进行前面算法得到一个字符串,然后生成一个下载链接,带上这个前面字符串和截止时间戳去访问 CDN。
在服务端,取出过期时间,和当前 CDN 节点时间进行比较,确认请求是否过期。然后 CDN 服务端根据请求的资源及路径、时间戳、和约定的加密字符串进行签名。只有签名和客户端发送的一致,才会将资源返回给客户。
动态资源缓存 对于动态资源,用到动态 CDN。动态 CDN 主要有两种模式:
1)“生鲜超市模式”,也就是边缘计算模式。
既然数据是动态生成的,所以数据的逻辑计算和存储,也相应的放在边缘的节点。其中定时从源数据那里同步存储的数据,然后在边缘节点进行计算得到结果。
这种方式很像现在的生鲜超市。新鲜的海鲜大餐是动态的,很难事先做好缓存,因而将生鲜超市放在你家旁边,既能够送货上门,也能够现场烹饪。这就是边缘计算的一种体现。