《构建高性能的web站点》读书笔记--组件分离
组件分离可以说是很多网站都在采用、最基础的提高网站吞吐的策略。比如我们看淘宝:像fuzhuang.taobao.com、home.taobao.com这样二级站点的分离,再比img01.taobaocdn.com、img02.taobaocdn.com的图片分离,a.tbcdn.cn样式的分离等,都是组件分离。
什么是组件分离
这里的组件就是所有基于url访问的资源,如动态内容、图片、脚本、样式等;组件的分离就是这些组件的垂直分割,不同的资源分布到不同的服务器或相同服务器的不同逻辑单元,并且配以独立的域名(顶级域名或二级域名)。从请求表面上,请求不同站点的资源,但是他们仍可以完美组成一个完整的页面。这本身也是负载均衡策略的一种,可以实现站点规模的扩展,以后会提到在各个组件之间内部实现负载均衡或集群。
分离的好处
分离对我们来说到底有多大的驱动力:
1,“因材施教”,提高网站吞吐。我们知道,不同的资源对于服务器的硬件资源的需求是不一样:动态内容需要大量计算或访问数据库,就需要CPU、内存的资源,而静态文件更需要的是I/O操作。通过分离我们可以针对特定的资源,“因材施教”,让组件可以充分利用服务器资源,以较成本提高服务器吞吐。
2,提高浏览器的并发。我们知道每个浏览器在解析完html,开始对页面中各个组件下载时,会维护一个下载队列,同一时刻只能对队列中一定数量的资源开始下载。如IE6/7默认的最大并发数,对于http1.1是2,http1.0是4,而ie8分别是6,6。
不过这个限制是有个前提的,只是对同一个域名下的组件有效。因此我们把组件分离到不同的服务器,并绑定上不同的域名或二级域名如:img.xx.com,js.xx.com等,这样就相当于提高了浏览器下载我们网站资源的并发数,加快页面的加载速度。
3,提高网站健壮性和可扩展性。就如上面所说这是负载均衡策略的一种,站点规模达到一定程度,这是我们必须选择路径,在此基础上,我们可以运用更多的负载均衡策略,以此提高网站的负载。
分离的依据
把js、css、图片等静态资源从主站独立到静态的站点,这可能是我们最简单有效的分离策略了,但是这还远远不够。就算是同类的组件,可能在文件大小、数量、更新频率、预计并发用户数、是否要脚本、是否需要大量的CPU运算、是否访问数据库、主要是读还是写数据库操作、是否要远程调用等等方面都存在很大的差异。例如对于图片来说,有可能是网站页面用到的基础图片,也可能是用户上传的大图片,这就要我们不同方式来区别对待。同是动态页面,呈现内容的页面和用于收集信息的动态页面,我们仍可以视为不同类的组件加以区别对待。
因此为组件分离提供一种最优最佳的方法肯定是一个需要不断进步的过程,我们必须从实际的业务需求,区分不同组件的要求,使得不同的组件能充分有效利用服务器资源,达到符合各自实际情况的吞吐最大化。
什么“材”,如何“教”
动态内容
动态内容就是需要动态脚本经过计算得到结果,如生成静态html、生成图片、生成json\xml数据等等,就像上面提到的,显示内容的和采集数据的动态程序一样,它本身又包含很多差异化的应用,这是由实际业务来决定的,因此动态内容的分离是一个持续的过程。如一般网站我们可以对前台显示和管理后台分离;对于同是前台页面,我们可以根据业务,如把新闻分离到独立站点等等,如果是资讯网站,可以根据资讯分类进行分离,但是切忌过度分离。
但是对于所有的动态程序,我们仍可以提供相同的“教”,为它们提供良好的空间:速度快的CPU、大容量的内存、特定优化的系统和服务器软件、与数据库保持高速连接、稳定可靠的数据中心,持续优化的程序架构。
静态内容
就是直接存储于服务器的html、图片等文件,不需要动态脚本执行,可以节省一定的CPU和内存的开销,更需要的是I/O操作。我们可以需要一个针对静态文件优化的文件系统和服务器软件之外、使用高速磁盘、使用RAID分区、提高服务器带宽也是可以采用的方法。另外不要忘了浏览器缓存,特别对于图片、脚本、样式等不太容易变化的内容,采用一个较长时间的浏览器缓存策略,是一个比较好的方法。
如果网站规模扩大,先规划下组件分离吧,下篇分享负载均衡。