缓存设计详解:低成本的高性能Web应用解决方案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

过去几年中,Web应用程序已经从简单的HTML页面堆积演变成使用各种各样的技术构建高可扩展性和交互式的富应用程序。设计和开发这类应用程序变得越来越复杂,此外,决策者正越来越多地寻求构建更丰富的互动功能到这些应用程序中,同时还要保证可维护性和高性能,但高性能意味着高成本。为了构建提供给最终用户体验的是一个牢固的应用程序,开发人员需要解决潜在的性能瓶颈。

本文侧重于缓存——它是交付高性能Web应用程序急需的——也简要介绍一下压缩功能。有一些公司在生产和销售专门的压缩和性能产品。本文旨在简单介绍在寻求专业产品解决性能问题之前开发人员可以在客户端和服务器端对Web应用程序做的一些性能改进。

性能瓶颈

性能瓶颈主要体现在高延时、拥塞和服务器负载。缓存不能完全解决掉这三个问题,但经过详细的设计考虑,缓存是可以提高性能的。在服务器端和客户端都缓存内容,据调查,平均而言,下载HTML只需要总的用户响应时间的10-20%,剩下的80-90%全部用于下载页面中的其它组成内容,这些组成内容通常包括图像,如公司logo,缓存logo可以有效避免到服务器的多次往返。在前日51CTO上发布的加速,加速,再加速:来自Google的网

站加速技巧大全中,Google提到的提升网站速度和性能的低成本技巧中就包括缓存这一条。至于架构设计方面,则可参考51CTO的视频专题:大型网站架构专家谈。

简单地讲,缓存是临时存储。它将数据复制到不同的计算机或不同于原始数据源的位置,有了正确的配置,访问缓存数据的速度比访问原始数据的速度要快得多,使用缓存数据可以减小服务器负载和带宽消耗,从最终用户的角度来看就是性能提高了。

图1显示了Internet如何工作的快速总揽,以及缓存在哪里发生作用。

?

图 1 Internet上的缓存:这个图显示了常见的请求和检索缓存信息的时

缓存

正如你在图1中所看到的,在服务器和客户端上缓存数据既是可能的也是有效的,图2显示了这三个缓存位置的不同视图。

?

图 2 缓存配置:此图显示了三个典型的缓存位置

1、客户端浏览器缓存:浏览器缓存Web对象后,可以对重复的请求直接响应,不用再从Internet请求数据了。

2、服务器端转发代理缓存:虽然可能有些变化,但这些缓存位置通常是在最终用户防火墙里面,可以对请求直接响应,不需要从原始来源请求数据。

3、服务器端反向代理缓存:也被称为网关或代理缓存,这些缓存服务器的操作代表了客户的来源服务器,术语“内容分发网络(CDN)”就是这些反向代理缓存的集合。

你可以缓存任何可能不止一次被请求的对象,但总有一个危险就是缓存的对象很可能变得陈旧,也就是说,没有准确地反应原始数据。不过可以使用两个参数来控制所有可缓存的对象:freshness和validation。freshness 和validation都可以使用HTTP请求和相应组合来进行确定。

◆Freshness确定某个对象是否可以从缓存中获得,使用expires和cache-control:max-age头进行控制。

◆Validation确定某个对象是否已经陈旧,使用last-modified和

if-modified-since头进行控制。

设计高度缓存的Web应用程序

企业级Web应用程序既有静态部分又有动态部分,只要进行了正确的设计和架构,都能够实现静态部分从缓存中获取,动态部分从原始服务器获取,但第一步是确定要缓存什么,图3提供了一个指南,可以帮助你确定哪些对象是可缓存,哪些对象是动态的(不可缓存的)。

?

图 3 确定缓存能力:此图提供了某个对象是否应该缓存的指南应用程序架构在可缓存对象和不可缓存对象之间有一点差异,开发人员应该寻求最大限度的缓存命中率,同时要避免缓存动态对象。下面是一些最佳实践:

1、使用缓存控制(cache-control:max-age)和有效期(Expires)头

2、使用最后修改时间(last-modified)头

3、检查Web服务器是否支持If-Modified-Since

4、调查为小型站点使用转向代理的可行性,或为大型企业网站从CDN厂家获得专业人员的帮助

5、根据网站的可扩展性思考是使用数据中心还是托管

6、自己动手编码常常需要大量的时间和精力,根据站点的规模,可以考虑采用开源缓存方法,如使用Squid作为代理服务器

7、为文件下载明确使用混合缓存机制

8、确保那些无用户/输入依赖的动态事务可以获得缓存,为不同对象创建缓存映像可以帮助将可缓存对象和不可缓存对象隔离开来

9、小心完全忽略缓存头的内容管理系统(CMS)

为缓存使用头(Header)

本节覆盖了为缓存目的最有用的头。

控制缓存

在HTTP 规范中,服务器应该为缓存控制头发送一个无缓存响应,以指出内容不应该被缓存,客户端和服务器端都应该遵守这个头信息,以防止头中已经声明了的动态内容,大多数开发语言都支持使用这个头信息控制响应头值。

另一方面,你可以为cache-control头返回一个public服务器端应答来允许缓存(即使没有cache-control头也可以指出对象是可以缓存的),cache-control头的值为private是一个特殊情况,表示浏览器可能会在本地缓存对象,但代理服务器不会缓存它。

图4中的请求——响应工作流显示了Google如何通过cache-control头通知代理服务器不要缓存的。

?

图 4 停止代理服务器缓存:请求--应答流显示服务器返回private阻止

代理服务器缓存

最后,服务器使用expires应答时包括了一个表示有效期的日期/时间戳,直到有效期满之前浏览器都可以缓存中的对象。如图5所示。

?

图 5 过期内容:Google的Gmail服务器返回一个expires头,包括缓存

页面的过期日期和时间

这一点你可以验证,Gmail允许浏览器缓存Gmail主页,直到expires

头中明确指定的时间到了为止。

使用Last-Modified 头

相关文档
最新文档