4.4.2 内容分发

在DNS服务器的协助下,无论是对用户还是服务器,内容分发网络都可以是完全透明的,如在两者都不知情的情况下,由CDN的缓存节点接管了用户向服务器发出资源请求。后面随之而来的问题是缓存节点中必须有用户想要请求的资源副本,才可能代替源站来响应用户请求。这里面又包括两个子问题:“如何获取源站资源”和“如何管理(更新)资源”。CDN获取源站资源的过程被称为“内容分发”,“内容分发网络”的名字正是由此而来,这也是CDN的核心价值。目前主要有以下两种主流的内容分发方式。

·主动分发(Push):分发由源站主动发起,将内容从源站或者其他资源库推送到用户边缘的各个CDN缓存节点上。这个推送的操作没有什么业界标准可循,可以选择任何传输方式(HTTP、FTP、P2P,等等)、任何推送策略(满足特定条件、定时、人工,等等)、任何推送时间,只要与后面说的更新策略相匹配即可。由于主动分发通常需要源站、CDN服务双方提供程序API接口层面的配合,所以它对源站并不是透明的,只对用户一侧单向透明。主动分发一般用于网站要预载大量资源的场景。譬如在双十一之前的一段时间内,淘宝、京东等各个网络商城会把未来活动中所要用到的资源推送到CDN缓存节点中,特别常用的资源甚至会直接缓存到你的手机App的存储空间或者浏览器的localStorage上。

·被动回源(Pull):被动回源由用户访问所触发,是全自动、双向透明的资源缓存过程。当某个资源首次被用户请求的时候,若CDN缓存节点发现自己没有该资源,就会实时从源站中获取,这时资源的响应时间可粗略认为是资源从源站到CDN缓存节点的时间,加上资源从CDN发送到用户的时间之和。因此,被动回源的首次访问通常比较慢(但由于CDN的网络条件一般远高于普通用户,并不一定比用户直接访问源站更慢),不适合应用于数据量较大的资源。被动回源的优点是可以做到完全的双向透明,不需要源站在程序上做任何配合,使用起来非常方便。这种分发方式是小型站点使用CDN服务的主流选择,如果不是自建CDN,而是购买阿里云、腾讯云的CDN服务的站点,多数采用的就是这种方式。

对于“CDN如何管理(更新)资源”这个问题,同样没有统一的标准可言,尽管在HTTP协议中,关于缓存的Header定义中确实有对CDN这类共享缓存的一些指引性参数的定义,譬如Cache-Control的s-maxage,但是否要遵循,完全取决于CDN本身的实现策略。更令人感到无奈的是,由于大多数网站的开发和运维人员并不十分了解HTTP缓存机制,所以导致如果CDN完全照着HTTP Header来控制缓存失效和更新,效果反而会很差,还可能引发其他问题。因此,对CDN缓存的管理不存在通用的准则。

现在,最常见的做法是超时被动失效与手工主动失效相结合。超时被动失效是指给予缓存资源一定的生存期,超过了生存期就在下次请求时重新被动回源一次。而手工主动失效是指CDN服务商一般会提供处理失效缓存的接口,在网站更新时,由持续集成的流水线自动调用该接口来实现缓存更新,譬如“icyfenix.cn”就是依靠Travis-CI的持续集成服务来触发CDN失效和重新预热的。