搞定系统设计:面试敲开大厂的门
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.7 内容分发网络

内容分发网络(Content Delivery Network,CDN)是由在地理上分散的服务器组成的网络,被用来传输静态内容。CDN中的服务器缓存了像图片、视频、CSS和JavaScript文件这一类的静态内容。

动态内容缓存是一个相对新的概念,不在本书讨论的范围内。它可以基于请求路径、查询字符串、cookie和请求头来缓存HTML页面。感兴趣的读者可以访问ASW的网站以了解更多内容。本书只讲解如何使用CDN缓存静态内容。

现在我们大致介绍一下CDN是如何工作的:当用户访问一个网站时,离用户最近的CDN服务器会返回静态资源。给人的直观感受是,离CDN服务器越远,网站加载内容就越慢。举个例子,如果CDN服务器在旧金山,那么洛杉矶的用户就比欧洲的用户更快获取网站内容。图1-9展示了CDN是如何缩短加载时间的。

图1-9[6]

图1-10展示了CDN的工作流。

图1-10

1.用户A尝试通过请求图片的URL去获取image.png。这个URL的域名由CDN服务商提供。亚马逊和Akamai CDN上的图片URL大概是下面这个样子:

• https://mysite.cloudfront.net/logo.jpg

• https://mysite.akamai.com/image-manager/img/logo.jpg

2.如果CDN服务器的缓存中没有image.png,CDN服务器就会向数据源服务器请求这个文件。数据源服务器可以是Web服务器,或者线上存储,比如Amazon S3。

3.数据源服务器将image.png文件返回给CDN服务器,其中包括可选的HTTP头Time-to-Live(TTL,生存时间)。TTL描述了该图片文件应该被缓存多长时间。

4.CDN服务器缓存这个图片并将其返回给用户A。这个图片一直缓存在CDN服务器中,直到TTL到期。

5.用户B发送请求,要求获取这张图片。

6.只要TTL还没到期,CDN服务器的缓存就会返回该图片。

1.7.1 使用CDN时的注意事项

• 花销:CDN是由第三方供应商来运营的,对数据在CDN中的进出都会收费。缓存不经常使用的内容,并不能给性能带来显著的好处,应该考虑把这些内容从CDN中移出。

• 设置合理的缓存过期时间:对于时间敏感的内容,设置缓存过期时间是很重要的。这个时间不应该过长或过短。如果过长,内容会不够新。如果过短,可能导致频繁地将内容从数据源服务器重新加载至CDN。

• CDN回退:要好好考虑你的网站或应用如何应对CDN故障。如果CDN出现故障暂时无法提供服务,客户端应该有能力发现这个问题,并直接向数据源服务器请求资源。

• 作废文件:以下操作均可以在文件过期之前将其从CDN中移除。

◆ 调用CDN服务商提供的API来作废CDN对象。

◆ 通过对象版本化来提供一个不同版本的对象。可以在URL中添加一个参数,比如版本号,来给一个对象添加版本。比如,在查询字符串中可以加入版本号2(image.png?v=2)。

图1-11展示了加入了CDN和缓存之后的系统设计方案。

1.静态资源(JavaScript代码、CSS文件、图片等)不再由Web服务器提供,而是从CDN中获取,以提高响应速度。

2.数据被缓存后,数据库的负载就减轻了。

图1-11