高性能Web服务器的思考

如何实现网站的高并发量,这是每一个网站都需要解决的问题。以下是关于构建高性能,高并发的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. 因为后续还涉及到了筛选合并。总之,比较复杂

CDN镜像