涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven。
一个网站不可能说一开始就是要设计一个能够考虑所有情况的完美架构,一个成熟的架构都是随着需求的变化,流量的增高来随之变化的。
基本架构:
web服务器:ngnix+apache做负载均衡
技术架构: freemarker+springMVC+ibatis(myIbatis)+memcache+mysql
这样的架构一般的网站日均UV在几万十几万的情况下,部署个几台web机器基本就可以满足了。
一、随着流量的增加,首页想到要优化的就是数据库
1、分库 可以根据业务模块的划分进行分库,用来减轻单库压力。
2、分表 对个别数据量非常大的表,进行分表,减少单表数据量,提高查询速度。
3、分库之后,对于核心数据库,可以进行主/从库处理,将查询与更新分离,提高插入速度。
4、梳理业务,对于像动态之类的写量非常大,写后并不更新这类特征的数据,可以采用mongdb,获得更高的性能和更简单的业务处理。
数据库做到这个层面上,基本上就差不多了,新的业务进来,数据库可以从容的进行水平扩展。
二、随着业务渐渐复杂,数据库又分库分表,可能有一些业务流程就非常的长,导致应用程序需要去N个库查询或者更新N张表,这样客户端的响应就非常慢了,这个时候就需要异步登场了。
推荐:JMS,使用activeMQ,这些spring都有很好的实现。
三、缓存服务器,网站有一些基本信息,例如:网站配置信息、登录用户信息等等,这类核心数据,差不多每次请求都要去读取,但是这些数据是不怎么会变的,每次还要去memcache缓存服务器上去读取,服务器间通信也是要时间的,可以考虑本地缓存。
推荐:EhCach。它是一个纯Java的进程内缓存框架,具有快速、精干等特点。
四、静态化。网站首页、还有二级域名首页等类似首页性质的页面,访问量都比较大,静态化掉。可以定时任务几分钟生成一次。
推荐:Quartz。开源的作业调度框架。(其实这个一开始就应该集成进去,因为你的网站肯定会有类似的定时任务的需求,Quartz是当仁不二的选择)。
五、静态文件优化。
1、这个是html和js还有静态图片等,这些的优化方案就比较多了,js组件化,按需加载,css sprite等等,前端优化博大精深,这里就不说了,网上有很多方案,这是一个长期的优化和任务。
2、静态文件存储,分布式文件存储,开源的解决方案也有很多,MogileFS、HDFS
六、业务解耦。随着系统越来越复杂,它就像一个庞大的机器,所有的功能师都在上面开发,新手,老鸟,不关是谁,除了个别资深程序员和架构师以外,其他人未必能理解整个系统,很容易造成bug,而发布就变成了噩梦,只要有个人的功能有问题,整个系统就不能发布,所有人都得停下来等,造成大量资源浪费,加班严重。此阶段,必然需要系统拆分,将系统按照业务进行划分,例如用户模块、博客模块、图片模块等等。各个模块之间通过外部接口进行通讯,各个模块可以单独开发单独部署,互不影响。