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