在WEB网站的规模从小到大不断扩展的过程中,用户访问量和并发量不断增加。
构建大型的商业网站绝对不可能像构建普通的小型网站一样一蹴而就,需要从严格的软件工程管理的角度进行认真规划,有步骤有逻辑地进行开发。
对于大型网站来说,所采用的技术涉及面极其广泛,从硬件到软件、编程语言、数据库、Web服务器、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。
那如何优化程序和网站进行部署呢?
以下是我的几点个人看法(个人用NHibernater + MySQL或MSSQL)
一:页面缓存和数据缓存
这绝对不单指低级的缓存技术相关的编程,应从整个架构角度着眼,深入研究Web服务器、数据库服务器的各层级的缓冲策略,最后才是低级的缓冲技术的编程。
1:为了让网站支持更好的缓存机制,在开发过程中所有ASPX文件和ASCX文件不能直接访问Session或Cookie,因为如果直接访问这些数据,会造成服务器把当前用户的缓存给到另外一个用户的情况,任何个人信息都通过客户端的javascript访问Cookie或Ajax请求数据取得。
2:Hibernate的缓存包括Session的缓存和SessionFactory的缓存,在系统设计的时候就要设定好数据的变更周期,以更好的设置数据的缓存时间,防止加载数据库数据;
3:在对外数据的展现,也就是所有非事务的Select语句中一定要用:"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" 来声明事务级别(MSSQL可以用NOLOCK方式,但为程序可以兼容多种数据库,建议用脏读方式),提高读取性能,防止出现读取到锁定数据,造成阻塞。
二:Web服务器分布式负载均衡
1:运用LVS+Keepalived进行负载均衡部署(同时防止单点故障,参考:Linux 下 LVS+Keepalived 负载均衡安装)
2:负载均衡后用Memcached 进行集群缓存,并实现Session共享,防止因为负载均衡后Session丢失。
三:数据库优化
1:优化索引
2:读写主从分离:运用MySQL的MHA来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,实现主从分离,再利用Altas进行读写分离提高数据库性能(参考:Mysql MHA 主从配置+Keepalived测试使用说明 、MySQL+Altas 读写分离测试(Altas 不能用存储过程,Update和Delete必须要有参数))
3:分库:将数据库按照不同的业务进行分库
4:分表:将同一个表,按照不同的业务逻辑进行区分,如订单表可分为1星期内,一个月内,三个月内,一年内,四个不同的表,正常业务逻辑最多的都是查询今天或这几天的数据,面其他数据一般都不会查到