叁·分

不求甚解

用户工具

站点工具


tech-notes:a-brief-introduction-to-cdn

CDN 技术

内容分发网络1),即 CDN,在网络发达的今天扮演着重要的角色。

在没有 CDN 的年代,网站服务器接入互联网的链路质量——如带宽——决定了其能为用户提供的访问速度和并发访问量。如果业务繁忙,用户的访问数越多,拥塞越严重,网站会在需要向用户提供服务时失去用户。就好比一个国家只有一座图书馆,位于首都,10km 外的 A 市甲、300km 外的 B 市乙和 700km 外的 C 市丙,同时向图书馆写信请求同一本书,由于图书馆只有一本藏本,结果可想而知。而通过 CDN 部署在各个物理位置的服务器进行资源分发,就可以实现跨运营商、跨地域的用户覆盖。下图就是单服务器内容分发和 CDN 网络内容分发的简易图示。

 单服务器内容分发

 CDN 网络内容分发

CDN 是请求路由、负载均衡和缓存等内容服务技术的集合,以下依次简介:

请求路由

CDN 网络会将用户的请求重新定向,如,将请求定向到离用户最近的服务器,以达到快速分发静态网络资源的目的。请求路由的实现有多种,如全局负载均衡2),基于 DNS 查询的路由3)和任播技术4)等。请求路由一般不做实际的内容承载,改变的是内容请求路径。

负载均衡

负载均衡的作用是在多个节点之间按照一定的策略(算法)分发网络或计算处理负载。负载均衡的背后是集群技术。集群是一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作的系统,从用户感知上,仅仅是作为一个服务器存在。集群用来提高服务的可靠性,而负载均衡则负责在进群服务器中进行合理的任务分配,如,把大量的并发访问或数据流量分担到多台节点上分别处理,减少用户等待响应的时间;或者,将单个高负载的运算分担到多台节点上做并行处理后将结果汇总,再返回给用户,提高信息系统处理能力。由于 CDN 网络较少处理动态内容,因此 CDN 网络中的负载均衡更多负责流量或者请求路由的分配,做静态资源分发的 CDN 网络一般会在集群中各个服务器中分发相同的静态资源,由负载均衡系统选择离用户最近或连接数较少的服务器负责响应,因此部分功能算法与请求路由的算法相重叠。CDN 网络集群中的静态资根据缓存状态进行分发和更新。

缓存

缓存分为很多种,比如数据库缓存、CDN 缓存,以及浏览器缓存。有 CDN 网络服务的资源请求的路径如下图:

<flowchartjs default> str⇒start: 浏览器发起 Web 请求 cond⇒condition: CDN 判断 是否需要向 源服务器 请求资源 e⇒end: 源服务器 str(right)→cond(yes, right)→e </flowchartjs>

在一般情况下,页面的缓存状态是通过源服务器在响应请求时的 Response Headers 决定,控制缓存的 Response Headers 有:Cache-Control、Expires、Last-modified、ETag。

如,请求 https://code.jquery.com/jquery-2.2.4.min.js 的 Response Headers 如下:

access-control-allow-origin:*
cache-control:public
cache-control:max-age=315360000
content-encoding:gzip
content-type:application/javascript; charset=utf-8
date:Fri, 13 Oct 2017 16:46:28 GMT
etag:W/"573f4859-14e4a"
expires:Thu, 31 Dec 2037 23:55:55 GMT
last-modified:Fri, 20 May 2016 17:24:41 GMT
server:NetDNA-cache/2.2
status:200
vary:Accept-Encoding
x-cache:HIT
...

Cache-Control

上例中可以看到 Cache-Control 中有 publicmax-age 两个指令。

public 指令允许缓存在用户间共享,CDN 服务器中缓存的也多为 public 类资源。与其相反 private 响应只作为私有的缓存,不能在用户间共享。max-age 表示指定浏览器设置缓存最大的有效时间,定义的是时间长短。当浏览器向服务器发送请求后,在 max-age 这段时间里浏览器就不会再向服务器发送请求了。Cache-Control 中还可能会包含 s-maxage、no-cacheno-storemust-revalidate 等指令,在此不一一展开。

Expires

缓存过期时间是源服务器用来指定资源到期的时间,告诉浏览器在过期时间前可以直接从浏览器缓存取数据,而无需再次请求。

Last-Modified

服务器端文件的最后修改时间是检查服务器端资源是否更新的一种方式。当浏览器再次进行请求时,会向服务器传送 If-Modified-Since 报头,询问Last-Modified 时间点之后资源是否被修改过。如果没有修改,源服务器会返回 304,告诉浏览器使用缓存;如果修改过,浏览器会再次去服务器请求最新资源。

ETag

ETag 是源服务器根据被请求的资源生成的一段标识。浏览器会将这串字符串传回服务器,以供源服务器验证客户端缓存资源是否过期。

总体来说,缓存请求过程可以用以下流程来综合表述:

<flowchartjs default> str⇒start: 用户请求资源 e⇒end: 返回显示资源 cond1⇒condition: 是否存在缓存 cond2⇒condition: 缓存是否过期 cond3⇒condition: 是否需要判断 Etag cond4⇒condition: 是否需要判断 Last-modified cond5⇒condition: 服务器返回 304 op1⇒operation: 直接使用缓存内容 op2⇒operation: 向服务器请求 If-none-match op3⇒operation: 向服务器请求 If-modified-since op4⇒operation: 读取本地缓存 op5⇒operation: 向服务器请求 op6⇒operation: 请求响应,缓存协商

str→cond1 cond1(yes)→cond2 cond2(yes)→cond3 cond3(yes)→op2→cond5 cond5(yes)→op4 cond5(no)→op6 cond3(no)→cond4 cond4(yes)→op3→cond5 cond4(no)→op5→op6 cond2(no)→op1 cond1(no)→op5→op6

op1→e op4→e op6→e </flowchartjs>

1)
Content delivery network,缩写:CDN
2)
英语:Global Server Load Balancing,缩写:GSLB
3)
英语:DNS-based request routing
4)
英语:Anycasting,任播是一种网络定址和路由的策略,使得资料可以根据路由拓扑来决定送到“最近”或“最好”的目的地。
tech-notes/a-brief-introduction-to-cdn.txt · 最后更改: 2019/08/15 11:47 由 Librarian