如何实现网站的高并发量,这是每一个网站都需要解决的问题。以下是关于构建高性能,高并发的Web服务器的思考
单机部署
一台服务器,同时部署了web容器和数据库,一般搭建个人网站,用来练练手,都是这样的模式。
应用程序和数据库分离
应用服务器和数据库分别单独部署,减小了服务器的压力,达到了程序和数据解耦的目的。但是却增加了远程传输所带来的性能的消耗。
动态资源和静态资源分离
网站有很多资源,可以分为静态资源和动态资源。
静态资源是HTML,JavaScript,CSS, img等文件,这种资源可以直接呈现给用户看的页面资源
动态资源不能直接得到,往往是需要执行一些程序动态生成的资源,例如获取数据库的数据,并最终转化成静态资源。SpringMVC中返回的ModelAndView就是动态资源。
动静分离就是把静态资源与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用的访问速度。
好处:减轻后端服务器的压力,提高静态资源访问速度
坏处:导致网站的SEO受影响(可以采用前端缓存技术来解决,把不经常变的数据缓存起来)
服务拓展&负载均衡
之前提到的应用服务器都是单台服务器,可以采用服务器集群的方式部署应用服务。
垂直拓展
垂直扩展意思就是努力提高后端服务的服务能力,如何优化业务逻辑?如何提高代码质量?使用多线程(进程)?使用NIO?能否从单机硬件着手,比如增加服务器内存,磁盘容量,购买更好的CPU……以期能提高服务的负载能力。
水平拓展
采用服务器集群的技术,增加多台廉价的服务器提供服务,去分摊负载,减小每台服务器的负载。这里需要一个负载均衡的策略。
数据库性能提升
Web服务都会和数据库打交道,就会涉及到I/O操作和网络传输。众所周知,I/O操作相比于内存运算简直是慢成狗的,那么我们可以考虑以下几种策略:
NoSQL缓存
分布式内存数据库,主流的有memcached以及Redis
数据库垂直拆分
把多张表划分到不同的数据库中,联系紧密的表可以划分在同一个数据库
数据库的水平拆分
单个表的数据太大了,可将此表拆分到不同表,或者不同服务器的数据库中。例如,id(0-999)的数据划分到user1,id(1000)划分到user2. 因为后续还涉及到了筛选合并。总之,比较复杂