资讯

展开

CDN系列学习文章(四)——缓存机制

作者:快盘下载 人气:

“所有文件配置缓存30天,相同CDN节点测试,一周后请求怎么就回源了?”

‘’明明设置了CDN缓存时间为0,为啥还缓存?”

带着这两个问题,咱们从缓存空间,内容和策略三方面来介绍CDN节点缓存机制

1.缓存空间

CDN服务器会将内容存储,以块形式,存储到磁盘中。磁盘容量是有限的,为了保持容量在一个健康水位,一般遵循删除策略(文件最久未访问)来淘汰文件。假设,互联网上所有静态资源在CDN节点上配置缓存时间都是一年,如果磁盘严格遵守缓存时间来缓存内容,这一年下来,CDN机房都没有地方来放磁盘了。因此在CDN上配置较长的缓存时间,CDN节点行为是尽力而为,并不是严格遵守。这里应该明白第一个问题了吧

2.缓存内容

CDN节点到底缓存源站哪些内容呢?CDN缓存内容来源于HTTP请求响应内容,HTTP响应包括状态行,header头部,body。这里问一个问题

如果CDN节点把源站所有响应都缓存下来,有什么影响?讲道理,缓存就应该把源站响应内容全盘照收,然后将缓存内容返回给用户。但这里有问题,既然是HTTP响应中,除了body之外,状态行和header很多字段是重复的,如果把这些字段都缓存在磁盘,对磁盘空间是一种浪费。更糟糕的情况,如果都是1K小文件,一个盘里存储内容都是状态行和header,显然是不合理的。一般CDN厂家,对缓存HTTP响应header策略有差异,但基本规则都差不多:

body这个肯定是需要缓存的,这点没啥好说的。(蓝色框,测试仅内容显示大小)状态行,这个一般不缓存,都是程序逻辑判断生产。(红色框)header,保存和缓存相关的字段,各家厂家有所差别,例如last-modify,expired等(黄色框)

CDN系列学习文章(四)——缓存机制

HTTP响应

3.缓存策略

CDN缓存策略。可能大家对这个概念比较模糊,咱们细化为两个问题:

CDN节点基于什么条件来决定该文件是否缓存?

这个问题,反过来想,CDN节点肯定是能缓存任何响应内容,但是在海量资源里,系统如何能找到这个资源呢?都不要思考,肯定是请求URL呀。如果每条URL都配置缓存策略也是不现实的,但是对这些URL进行抽象成不同的正则表达式,对应缓存策略。这个正则,在系统内成为缓存key,每一个缓存key对应一个缓存时间,也是对应缓存策略。即使遵循上面缓存规则,但是是否所有源站响应的内容都是缓存呢?当然不是,例如5XX,4XX,3XX这些异常响应内容默认是不缓存的。一方面,CDN缓存主要缓存body内容,而这些状态码对应body内容价值较少,还浪费磁盘空间;另一个方面,可能会影响正常业务访问。如果配置502缓存1小时,源站异常1分钟,本来只影响一分钟业务,由于配置了502,用户访问直接吐缓存资源,结果影响了1小时。

用户请求,节点发现缓存文件过期,CDN处理逻辑?这里不同厂家处理方式不一样

回源拉取文件,直接覆盖缓存文件,对IO有消耗。回源拉取文件,节点判断Mtime,如果Mtime一致,直接吐缓存文件,不进行覆盖。这里试想,如果设置了缓存时间为0,但是源站的Mtime没有修改,这样就会出现开篇第二个问题情况。

加载全部内容

相关教程
猜你喜欢
用户评论
快盘暂不提供评论功能!