如何构建大型高效网站
转一篇网上文章:
提高效率,大致需要考虑四个方面:一是在计算能力方面考虑,二是在IO方面考虑,三是在数据库方面考虑,四是在网络传输速度方面考虑。
(一).计算能力
原则:分散不同的计算任务到不同的节点中,尽量多的保存计算结果,尽量少的重复计算,特别是运行时重复计算。
1.负载均衡
负载均衡是多台同质服务的集合。分为软硬件两种方式,硬件效果较好,维护简单,可以用来应付大部分情况,就是需要一定的Money。比如F5、Radware等。至于软件方面,一般的大型应用服务器都提供,比如Weblogic的集群。
2.分布系统
分布系统是多台异质服务的集合。将服务分成不同类型的节点,每个节点提供特定的服务。比如可以将核心业务和辅助业务分开,将不同的辅助业务分开。
3.松散结构
松散结构是指不同的系统之间可以是异构的,系统间尽量少的通讯,一般仅采用简单的数据库同步或消息同步。个人觉得Web Service不太适合大型网站系统。松散结构除了能分散计算压力,也有助于提高系统稳定行和可维护性。
4.高效框架和算法
尽量少使用通用框架,比如Hibernate、Spring等,因为通用框架一般都是为了达到某种目的而牺牲了很多性能。对于核心业务逻辑以及最大消耗的业务逻辑,必须设计高效算法,算法设计的优劣区别往往即在于此。另外,为了照顾到开发效率和可维护性,在采用了页面静态化或文件缓存的前提下,可以在开发方面采用一些通用框架,以降低维护成本,这也是松散结构思想的提现。
5.页面静态化
对于不需要实时刷新的数据,尽量采用静态页面。对于需要定时刷新或不定期刷新的页面(刷新频率不能太高),可以考虑采用更新程序负责定期抓取更新静态页面。
6.避免频繁创建和销毁对象
对于Java而言(我觉得对于任何语言可能都一样),在内存中频繁创建和销毁对象,都会带来不小的开销。所以,尽可能使用少的同类对象,当然,同时需要考虑线程安全问题了。
(二).IO方面
原则:尽量少的读取硬盘,尽量多的读取内存
硬盘的读取可能包括数据库存储、磁盘文件等。为了提高速度,可以将适当的数据放在内存中直接读取。
1.数据缓存
对于经常要重复使用的数据,必须要放在内存中缓存起来,不能每次都从磁盘读取。可以采用全局内存变量、Memory Cache等。
2.文件缓存
对于大的文件,特别是静态文件,比如图片、附件等,在需要频繁读取的情况下,必须要将这些数据读取到内存中缓存起来,在下次读取的时候直接从内存中读取,而不是每次都去读磁盘。可以采用squid来完成此任务。
(三).数据库
现在的系统基本上都离不开数据库,所以,在一个系统中,数据库使用的优劣往往决定了系统效率的高下。
数据库优化的基本原则:提高数据计算能力,减少单表数据、提高查询命中率,增加冗余、减少单库和单表压力,优化查询语句、提高查询效率。
1.Rac模式、分布式数据库等
这些都是基于数据库本身的提高效率的方式。我也不太熟悉,只是大体知道。这些往往都能同时提高稳定性和效率。
2.分库策略
尽可能将访问频繁的不同业务数据分在不同的数据库来存放,这样能提高并发访问效率。
3.分表策略、及时备份历史数据策略
尽可能将大数据量的业务表采用某种分类标识来分成不同的表。可以考虑将历史数据和现实数据分开存放。
4.冗余策略
有两种层面的冗余,一种是对于经常需要关联查询的数据,可以在不同的业务表中冗余存储(字段冗余);另外一种是对于不同的程序、不同的站点,将同质数据或者同类数据在不同的节点冗余存储(节点冗余)。
5.索引
索引有利于快速定位目标,对于提高查询效率有很大的作用;当然,索引也不能滥用,毕竟,多维护一个索引就会给数据库多增加一份压力。所以,结论是要适当使用索引。
6.SQL优化
为了查询出一个业务目标,也许有很多种查询方法,但是最优的只有一种。对于网站业务而言,特别是核心业务和大消耗业务而言,SQL的优化更是一个重要的事情。目前能想到的有参数化、预编译、考虑关联表的大小、考虑条件对索引的使用、考虑物理存储方式。有时间的话,我会专门写一下这个专题。
7.避免稀疏表
频繁地插入和删除一个表中的数据,会造成稀疏表,对于存储和查询而言都有额外的消耗。在设计数据库结构的时候需要考虑这一点。
8.连接池优化
频繁的创建和销毁数据库连接,效率应该比较低下。一般来说,都会使用连接池来提高效率。常见的有服务器自带的连接池、第三方提供的独立连接池(C3P0 、Proxool、Jakarta DBCP等)。
9.精心设计事务、尽量缩小事务范围
事务对数据库的消耗是不言而喻的,所以一定要尽量缩小事务范围,尽量避免长事务。
(四).网络传输
1.网通、电信双线路
南电信、北网通是中国网络现状,两个网络间的互联是比较差的,所以,对于要兼顾全国用户的网站,网通、电信双线路是必须的,目前很多IDC都提供双路接入服务。
2.在各地多建分站点,特别是对于影响系统效率的关键资源
对于效率要求特别高的网站,可以考虑南北建站,这一点也是为了适应南电信、北网通的网络现状。更进一步说,可以考虑在更多的地方建分站,比如各个省会城市。当然,对于这种很多分站的系统,需要考虑数据库的节点分布问题,会带来额外的消耗。可以考虑各个站点有独立的数据库,然后定时同步数据;或者采用集中数据库,各个站点之间用专线连接起来。
3.系统内交互尽量在一个局域网内,或者采用专线来传输
系统内交互包括所有依赖于网络的交互,一般包括各个子系统之间的交互、系统和数据库之间的交互,数据库和数据库之间的交互等。
对于网站而已,安全肯定是一个不得不考虑的问题,这个在以后的文章中再来谈谈;还有,开发策略也是一个很重要的事情,以后再专文写一个。
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!









No Comments, Comment or Ping
Reply to “如何构建大型高效网站”
You must be logged in to post a comment.