作者: H.E. | 您可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 
网址: http://www.javabloger.com/article/high-concurrent-common-coping-strategies.html
豆瓣读书 向你推荐有关 Hadoop、 J2ee企业顾问、 Linux/Unix、 MapReduce、 NoSQL、 web、 云计算、 分布式、 存储、 性能、 架构设计、 类别的图书。

 

一个运营的系统在正式上线后将会遇到各种层级的高并发请求,因此我们必须对此做出相应的策略和技术解决方案,首先我们需要认清系统的高并发由3个层面导致:

1.传输层
大量用户对系统请求后,将会造成网络带宽和Web服务器的I/O瓶颈。

2.计算层
接收大量用户请求进行计算,将会造成业务服务器和业务支撑服务器的瓶颈。

3.存储层
传输层和计算层将会产生大量的数据,数据量暴增,将会导致数据库和储存上的瓶颈。

针对以上将会造成的系统高并发瓶颈,我们需要采用不同的技术手段解决。

从总体上来看
1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要充分的利用系统中软件、硬件的缓存机制,将能缓存的内容都进行缓存存储,减少计算层和存储层的压力。

2.其次需要对业务服务器和业务支撑服务器进行合理的分层,并且采用并行计算和分布式算法对大量计算进行处理,并且在开发的过程中需要采用Java SDK中并发包(Concurrency)进行编码实现。

3.存储层需要采用分布式文件服务器和列式的存储服务器进行构建,支撑海量数据的存放和读取,并且还要对关系型数据进行深层次的配置参数优化。

4.我们还需要清楚的认识到,将来根据系统运行的状态以及平台中不同的业务场景循序渐进的进行调整和优化。

   对于大型系统来说,采用的技术是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:将会使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。
   但是除了这几个方面,还没法根本解决面临的高负载和高并发问题,所以需要将计算和负载的压力分载到每个计算机上,使用不同的服务器集群机组进行分布式和并行计算,面对所产生的压力,下面这张图清晰的描述了,我们对系统中不同的计算瓶颈采用的不同解决手段,如图所示:
 
以下描述是针对不同层面产生的计算压力所采用的计算策略,清单如下:
传输层
1.CDN
    网络链路出口进行压力分载,通过CDN让用户访问最近的数据缓存。
2.智能双路
    针对电信、网通 不同的访问用户访问请求,对应用户访问请求进行服务器带宽的智能切换。
3.LVS
    对用户的请求进行压力分载,并且实现多种负载均衡的策略,也可以选择使用HA-Proxy实现。
4.HA-Proxy
   针对Web服务器进行方向代理,通过HA-Proxy将用户的请求分发到不同的Web服务器上。
5.Long-Polling
    在Web服务器上采用的一种策略,专门针对某个用户需要不断频繁的轮询访问。
6.Session2Cache
    将用户的会话进行集中处理,存放在中央式的缓存服务器当中,减少服务器之间的会话通信
 
计算层
1.MapReduce
   采用最经典的分布式算法对海量数据进行处理,将计算进行分载。
2.BSP
    BSP(Bulk Synchronous Parallel-大型同步模型)算法是基于MPI算法的基础进行演化,运用在系统中并行计算的部分。
3.Result Cache
    将计算的一部分结果进行缓存,缓解对存储层读取的请求。
4.Scatter/Gather
    中间通过一个服务器进行中转,将大量的请求分发给内部的服务器进行计算,类似前端的web反向代理。
 
存储层
1.读写分离
    由于系统的读大于写的频率,数据库架构采用了1主/多从,双主多从的策略,所以我们将会将读和写进行分离,并且将大量的读请求分散给多台不同的(Slave)服务器。
2.分区策略
    系统采用不同的时间段作为分区的主要策略,提高对数据的读写性能。
3.Sharding
    一台数据库将很快无法满足大量并发,需要使用库表散列,将数据库中的数据进行分散存储。
4.Column-Based
   使用在海量数据中的查询功能,采用列模式的存储方式将可以有效的提高系统查询效率。