专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 高并发架构详解

高并发架构详解

更新时间:2021-08-13 11:13:52 来源:动力节点 浏览3479次

高并发架构详解

1.什么是高并发

高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常意味着系统通过设计可以同时并行处理多个请求。

一些常用的高并发指标有响应时间(Response time)、吞吐量(throughput)、每秒查询率QPS(query/Second)、并发用户数等。

响应时间:系统响应请求的时间。比如系统处理一个HTTP请求需要200ms,而这200ms就是系统的响应时间。

吞吐量:单位时间内处理的请求数。

QPS:每秒响应请求数。在互联网领域,这个指标并不像吞吐量那么明显。

并发用户数:同时主机正常使用系统功能的用户数。例如,一个即时通讯系统,在一定程度上在线时,代表了系统的并发用户数。

2.如何提升系统的并发能力

Internet分布式架构设计,提高系统并发能力的方式,主要有两种方法:纵向扩展(Scale up)和横向扩展(Scale out)。

纵向扩展:提升单机处理能力。垂直扩展有两种方式:

(1)提升单机硬件的性能,例如:增加32核等CPU核数,升级百万兆等更好的网卡,升级SSD等更好的硬盘,扩展硬盘容量如2T,系统内存扩展如128G;

(2)提高单机架构的性能,例如:使用缓存减少IO次数,使用异步增加单服务吞吐量,使用无锁数据结构减少响应时间;

在互联网业务高速发展的初期,如果预算不是问题,强烈建议采用“增强单机硬件性能”的方式来提高系统并发性,因为公司的策略往往是开发业务时钟,而“提高单机硬件性能”往往是最快的方法。

无论是提升单机硬件的性能,还是提升单机架构的性能,都存在一个致命的问题:单机的性能总是有限度的。所以互联网分布式架构设计高并发的终极方案还是横向扩展。

横向扩展:只要增加服务器数量,就可以线性扩展系统性能。横向扩展是系统架构设计的要求,如何在架构的各个层次进行横向设计,互联网公司架构的通用层次扩展实践是本文的主要内容。

3.通用互联网分层架构

常见的互联网分布式架构,如上,分为:

(1)客户端层:典型的调用者是浏览器浏览器或移动应用程序

(2)反向代理层:系统入口,反向代理

(3)站点应用层:实现核心应用逻辑,返回HTML或JSON

(4)服务层:如果是服务的实现,就有这一层

(5)data-cache层:缓存加速Access Storage

(6)Data-database层:数据库固化数据存储

整个系统各个层次的层次扩展,以及如何执行的不同。

4.分层横向扩展架构实践

反向代理层的横向扩展

反向代理层的横向扩展是通过“DNS轮询”实现的:一个域名的dns-server配置了多个解析IP,每个DNS解析请求访问dns-server,都会轮询返回这些IP。

当Nginx成为瓶颈时,只要增加服务器数量,增加新的Nginx服务部署,增加一个外网IP,就可以扩展反向代理层的性能,实现理论上的无限高并发。

站点层的水平延伸

站点层的横向扩展是通过“Nginx”实现的。通过修改nginx.conf,可以设置多个Web后端。

当Web后端成为瓶颈时,只要增加服务器数量,部署新的Web服务,在Nginx配置新的Web后端,就可以扩展站点层的性能,让理论上无限的高并发。

服务层横向延伸

服务层的横向扩展是通过服务连接池实现的。

当站点层通过rpc-client调用下游服务层Rpc-server时,Rpc-client中的连接池建立到下游服务的多个连接,当服务成为瓶颈时,只要增加服务器数量,新的服务部署后,通过在 Rpc-client 建立新的下游服务连接,可以扩展服务层的性能,实现理论上的无限并发。如果需要优雅地进行服务层自动扩展,这里可能需要配置Heart Service自动发现功能支持。

数据层的横向扩展

在数据量大的情况下,数据层(缓存、数据库)涉及到数据的横向扩展,将存储在一台服务器上的数据(缓存、数据库)横向拆分到不同的服务器上,以达到扩展的目的系统性能。

互联网数据层有几种常见的水平拆分方式,以数据库为例:

按范围水平拆分

对于每个数据服务,存储了一系列数据,如上例所示:

USER0库,存储uid范围1-1kw

User1库,存储uid范围1kw-2kw

该计划的好处是:

(1)规则简单,service只判断UID范围就可以路由到对应的存储service;

(2)良好的数据均衡;

(3)比较容易扩展,可以随时添加一个uid[2kw,3kw]数据服务;

缺点是:

(1)请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大范围的服务请求压力会更大;

通过 Hash 水平分割

对于每个数据库,将一些数据存储在一个键值的散列中。

USER0 库,存储偶数 UID 数据

User1 库,存储奇数 UID 数据

该计划的好处是:

(1)规则简单,服务只能通过UID hash路由到对应的存储服务;

(2)良好的数据均衡;

(3)请求的统一性较好;

缺点是:

(1)不容易扩展,扩展一个数据服务,hash方法改变,可能需要进行数据迁移;

需要注意的是,通过水平分割来增强系统性能的方式与主从同步读写分离有着根本的区别。

通过拆分水平扩展数据库性能:

(1)每台服务器存储的数据量为总量的1/n,所以单机性能也会提升;

(2)N个服务器数据不相交,服务器上收集的数据是完整的数据集;

(3)数据拆分到n台服务器,理论上读性能扩展了n倍,写性能已经扩展了N倍(实际上远远不止n倍,因为单机数据数量为原来的1 /n);

通过主从同步读写分离扩展数据库性能:

(1)每台服务器存储的数据量与总量相同;

(2)N台服务器数据相同,都是全集;

(3)理论上读性能扩大了n倍,写还是单点,写性能不变;

缓存层的水平拆分与数据库层的水平拆分类似,多采用范围拆分和哈希的形式,不再展开。

5.概括

高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常意味着系统通过设计可以同时并行处理多个请求。

提高系统并发能力主要有两种方式:纵向扩展(Scale up)和横向扩展(Scale out)。前者纵向扩展可以增加单机硬件的性能,或者提高单机架构的性能来提高并发,但是单机性能总是有限的,互联网分布式架构设计高并发终极方案还是后者:横向扩张。

在互联网分层架构中,不同层次横向扩展的做法是不同的:

(1)反向代理层可以通过“DNS轮询”的方式横向扩展;

(2)站点层可以通过nginx横向扩展;

(3)可以通过服务连接池横向扩展服务层;

(4)数据库可以根据数据范围,或者数据散列的方式进行横向扩展;

每层实施横向扩展后,可以通过增加服务器数量的方式提高系统性能,使理论性能无限。

以上就是动力节点小编介绍的"什么是消息队列",希望对大家有帮助,想了解更多可查看Java在线学习。动力节点在线学习教程,针对没有任何Java基础的读者学习,让你从入门到精通,主要介绍了一些Java基础的核心知识,让同学们更好更方便的学习和了解Java编程,感兴趣的同学可以关注一下。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>