高并发服务器的逻辑处理瓶颈,该如何解决?
⇂の高并发服务器的逻辑处理瓶颈,该如何解决?
我经历的几家公司里,或多或少用到了高并发技术,下面结合自己的经验,姑且说下。。。
首先,需要不得不提下并发的概念!
并发(量):指定时间段内,系统同时处理的请求数!所以高并发是指指定时间内,系统同时处理大量的连接(请求)!
衡量并发量通常有一些特定的指标:
①,TPS(QPS):每秒的处理事务数量或者请求数量。
②,响应时间:完成一个请求需要的平均时间!
从这两个指标可以看到,提高并发能力落在了下面几个问题上:
1,如何提高并发连接数?你业务写的再好,如果服务器只允许几千的最大连接数(比如tomcat),那么你的并发能力就只能被限制在几千,为什么最大连接数被限制呢?早期的网络连接模型使用的是一个连接对应一个线程,这样内存开销很大,支撑不了大量的连接!
可以根据需要选择selector或者epoll网络IO模型,通过使用一个线程轮询或者事件触发的方式,能支持几万甚至更多的连接数,使用基于netty框架开发的nginx是一个不错的选择!
2,怎么将那么多连接数进行业务处理?
nginx不具有应用服务器的功能,也就是说具体的业务处理还是需要应用服务器来处理,比如tomcat,jetty等,因为nginx具有反向代理和负载均衡功能,可以将接受到的大量连接通过均衡的方式(轮询,权重,hash)分配到不同的应用服务器中进行业务处理!
3,怎么提高应用服务器的处理水平?
应用服务器的瓶颈有两个:
①,自身逻辑处理:在代码中尽量少创建对象,少创建线程,避免阻塞IO,尽量少用多层循环,少加锁,防止死锁等等策略,提高代码性能!
应用服务器还可以采用前后端分离(node.js+restful后端接口)让动态数据和静态数据松耦合,提升前端处理能力和后端的专一性!
②,数据库压力:一般来说,系统高并发压力主要是来自于数据库,可以根据业务需要,使用读写分离,双主互备,mycat,sharding-jdbc等实现分库分表(注意全局唯一ID,统计,连接查询等问题)等策略,提高数据库处理能力!
数据库还可以借助内存型缓存(redis等),缓存一些定义表,枚举等相对静态的数据提供快速的查询,可以搭建高可用的缓存集群!
上面的服务系统就是一个web服务集群,由nginx负载均衡加上几台应用服务器,使用缓存,再加上数据库集群算是一个比较常见的高并发集群!
但是如果业务需要解耦,那么需要进行业务拆分,根据业务提供不同的服务分布在不同的服务器上,这样就可以使用微服务框架,将业务服务隔离开来,避免单一服务对别的服务的影响!
4,如何使用微服务呢?
1,框架选择:springcloud或者dubbo!
2,服务注册与发现中心:zookeeper或者eureka,
3,微服务其他:客户端的负载均衡使用feign,网关zuul,统一的配置中心,断路器hystrix!
当然,微服务之间需要进行通信,通信方式可以有以下几种:
①,上面说的服务注册与发现!
②,直接restful模型使用http调用!
③,使用诸如redis,kafka类的消息中间件!
上面就组成了一个使用微服务框架搭建的,服务之间使用消息中间件通信,单个服务又可以使用nginx组成服务集群,同时进行前后端分离,缓存集群,数据库分库分表等的一整套分布式服务系统!
当然,还有网络因素,可以使用CDN技术,将不同地点的请求分发到不同的服务集群上,避免网络对速度的影响!
上面零散的说到了很多高并发的点,更多的是这些技术的落地,和具体问题的解决!如果你有技术实现上的问题,可发出来大家一块解决,更多的技术分享,敬请关注。。
✺▅高并发服务器的逻辑处理瓶颈,该如何解决?
下面就用我有限的知识和经验,讲一讲高并发下的系统处理方案。
1、大部分的系统应用,在建设初期都是单机应用,也就是一个应用服务器加一个数据库。
2、当访问量增多、并发量增加的时候,很多时候应用服务器会先扛不住,通常我们解决这个问题的方法是:把应用服务器做集群部署,在前面搭建负载均衡,例如硬件负载F5、软件负载Nginx。
3、应用服务器的压力暂时解决,但是数据库毕竟还是单台,这时候我们可以在整体的架构中增加缓存,已减少数据库的压力,最常见的是引入Redis,做集群化的部署。
4、业务继续发展,并发量持续增多,单库已经到了极限;这时候可以考虑分库,常见的做法是对分库字段进行hash()%N,按照结果将数据路由到某一个分库(分表)上。
5、系统继续发展,虽然应用是集群化部署,但是毕竟是单个应用,并且随着项目功能的增加,应用包也会越来越大,代码改动起来非常痛苦;这时候需要把应用拆分成多个应用,库也各自独立出来(说的很简单,过程非常之痛苦,所以很多公司在初期,就是按照这个架构搭建):
应用拆分成多个应用;
应用之间的服务发现和调用,都需要服务注册中心和网关的帮助;
6、虽然应用和库都拆开了,但是应用和应用质检的耦合度依然非常高,所以通常会引入消息队列,例如各种MQ、Kafka,把一些实时性要求不是那么高的服务解耦,比如交易完成时候给客户发一条短信,那么可以把待发送的短信放到消息队列中,短信平台从消息队列中获得消息发送短信。
7、这时候应用的体量已经比较大了,部署、运维、查错的难度加大,这时候需要引入很多组件,来帮助整个系统的稳定运行:
认证中心:安全性的问题要注意,一个接口不是随随便便都能访问的;
限流:当并发量突增的时候,系统肯定会扛不住,这时候限制一部分流量的进入;
监控中心:包括日志监控、服务链路监控、流量监控等等;
告警平台:系统发生异常时,需要及时通知运维人员;
图画的有些仓促,难免有不严谨的地方,大家可以留言指正(如果留言中有态度不好的,我就自动忽略了)。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。⇒▥高并发服务器的逻辑处理瓶颈,该如何解决?
高并发服务器逻辑处理瓶颈,如何解决?首先我们先了解什么是并发!
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
顾名思义,高并发就是在指定时间内,系统同时能够处理大量的请求(连接数)。
高并发衡量指标
响应时间:系统对请求做出响应的时间,即一个http请求返回所用的时间;吞吐量:单位时间内处理的请求数量;QPS(TPS):每秒可以处理的请求数或事务数;并发用户数:同时承载正常使用系统功能的用户数量,即多少人同时使用,系统还能正常运行的用户数量;根据上面衡量指标可以看到,提高并发能力必须解决如下几个问题:
如何提高并发连接数?那么多的连接数怎么进行业务处理?应用服务器的处理水平又该怎么提高?如何使用微服务架构提升高并发逻辑?别着急,这么多问题我们一个一个来分析解决!
如下图所示,常规的单一网络连接模型只能1个连接对应1个线程,压力都集中在内存,导致内存开销非常大,肯定支撑的连接数有限!(直接挂掉)
有道是业务写得再好不如一台高性能服务器,这个锅不一定要开发人员背的哦!!!服务器的连接入口就那么大(比如tomcat只有几千的连接数),那么处理的能力也只局限于几千。
怎么解决呢?选用合适的网络IO模型或者selector,通过使用一个线程轮询或者事件触发的方式,能支持几万甚至更多的连接数,再配合上nginx做负载就更完美了。
大家都知道nginx只是具有反向代理和负载均衡的功能,并不能处理具体的业务逻辑,不能担当应用服务器来使用。例如webSphere 、tomcat和jetty等,但是我们可以利用nginx将接受到的大量连接通过均衡的方式(轮询,权重,hash)分配到不同的应用服务器中进行业务处理!
要提高应用服务器的处理水平就要了解自己的应用服务器的瓶颈在哪里,一般有两个:
数据库压力:数据库是支撑产品业务的核心模块,系统的高并发的主要压力也是来源于数据库。处理方式有如下这些:数据库本身:建立有效索引、读写分离、双主互备、分库分表(sharding-jdbc等实现)等策略,提高数据库处理能力,减少压力!
结合内存数据库:例如redid、memcached等,根据业务需要缓存一些数据字典、枚举变量和频繁使用数据等减少数据库访问次数,提升数据库处理能力。
如上图web集群架构图所示:
用nginx负载多台应用服务器;使用redid/memcached做业务缓存;再加上数据库集群;组成了经典的web高并发集群架构。
代码中的业务逻辑:大家可以 参考阿里巴巴java开发手册 中的开发规范来做就好了,总的来说少创建线程、少创建对象、少加锁、防止死锁、少创建线程、注意内存回收等策略,来提升代码性能。
开发中可以采用前后端分离的架构模式,动静分离、松耦合等提升前后端处理能力。
先看一下非常火的这张微服务架构图:
主要包含11大核心组件,分别是:
核心支撑组件
服务网关Zuul服务注册发现Eureka+Ribbon服务配置中心Apollo认证授权中心Spring Security OAuth服务框架Spring MVC/Boot监控反馈组件数据总线Kafka
日志监控ELK调用链监控CATMetrics监控KairosDB健康检查和告警ZMon限流熔断和流聚合Hystrix/Turbine出来上述几点解决高并发服务器逻辑处理瓶颈外,还要考虑网络因素,例如采用CDN加速,将不同地点的请求分发到不同的服务集群上,避免网络对速度的影响!
总之,根据自身实际业务在合理范围内尽可能地拆分,拆分以后同类服务可以通过水平扩展达到整体的高性能高并发,同时将越脆弱的资源放置在链路的越末端,访问的时候尽量将访问链接缩短,降低每次访问的资源消耗。服务之间直接restful模型使用http调用,或者redis,kafka类的消息中间件通信。单个服务直接使用nginx做负载集群,同时前后端分离,数据库分库分表等一整套分布式服务系统!
ℤ↝高并发服务器的逻辑处理瓶颈,该如何解决?
高并发服务器逻辑处理瓶颈,如何解决?首先我们先了解什么是并发!
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。———来源《百度百科》
顾名思义,高并发就是在指定时间内,系统同时能够处理大量的请求(连接数)。
那么如何衡量高并发呢?
高并发衡量指标
响应时间:系统对请求做出响应的时间,即一个http请求返回所用的时间;
吞吐量:单位时间内处理的请求数量;
QPS(TPS):每秒可以处理的请求数或事务数;
并发用户数:同时承载正常使用系统功能的用户数量,即多少人同时使用,系统还能正常运行的用户数量;
根据上面衡量指标可以看到,提高并发能力必须解决如下几个问题:
如何提高并发连接数?
那么多的连接数怎么进行业务处理?
应用服务器的处理水平又该怎么提高?
如何使用微服务架构提升高并发逻辑?
别着急,这么多问题我们一个一个来分析解决!
1)、如何提高并发连接数?
如下图所示,常规的单一网络连接模型只能1个连接对应1个线程,压力都集中在内存,导致内存开销非常大,肯定支撑的连接数有限!(直接挂掉)
单一网络连接模型
有道是业务写的再好不如一台高性能服务器,这个锅不一定要开发人员背的哦!!!服务器的连接入口就那么大(比如tomcat只有几千的连接数),那么处理的能力也只局限于几千。
怎么解决呢?选用合适的网络IO模型或者selector,通过使用一个线程轮询或者事件触发的方式,能支持几万甚至更多的连接数,再配合上nginx做负载就更完美了。
2)那么多的连接数怎么进行业务处理?
大家都知道nginx只是具有反向代理和负载均衡的功能,并不能处理具体的业务逻辑,不能担当应用服务器来使用。例如webSphere 、tomcat和jetty等,但是我们可以利用nginx将接受到的大量连接通过均衡的方式(轮询,权重,hash)分配到不同的应用服务器中进行业务处理!
nginx负载
3)应用服务器的处理水平又该怎么提高?
要提高应用服务器的处理水平就要了解自己的应用服务器的瓶颈在哪里,一般有两个:
数据库压力:数据库是支撑产品业务的核心模块,系统的高并发的主要压力也是来源于数据库。处理方式有如下这些:
数据库本身:建立有效索引、读写分离、双主互备、分库分表(sharding-jdbc等实现)等策略,提高数据库处理能力,减少压力!
结合内存数据库:例如redid、memcached等,根据业务需要缓存一些数据字典、枚举变量和频繁使用数据等减少数据库访问次数,提升数据库处理能力。
web集群架构图
如上图web集群架构图所示:
用nginx负载多台应用服务器;
使用redid/memcached做业务缓存;
再加上数据库集群;
组成了经典的web高并发集群架构。
代码中的业务逻辑:
大家可以 参考阿里巴巴java开发手册 中的开发规范来做就好了,总代来说少创建线程、少创建对象、少加锁、防止死锁、少创建线程、注意内存回收等策略,来提升代码性能。
开发中可以采用前后端分离的架构模式,动静分离、松耦合等提升前后端处理能力。
4)如何使用微服务架构提升高并发逻辑?
先看一下非常火的这张微服务架构图:
微服务架构图
主要包含11大核心组件,分别是:
核心支撑组件
服务网关Zuul
服务注册发现Eureka+Ribbon
服务配置中心Apollo
认证授权中心Spring Security OAuth
服务框架Spring MVC/Boot
监控反馈组件
数据总线Kafka
日志监控ELK
调用链监控CAT
Metrics监控KairosDB
健康检查和告警ZMon
限流熔断和流聚合Hystrix/Turbine
总结
出来上述几点解决高并发服务器逻辑处理瓶颈外,还要考虑网络因素,例如采用CDN加速,将不同地点的请求分发到不同的服务集群上,避免网络对速度的影响!
总之,根据自身实际业务在合理范围内尽可能的拆分,拆分以后同类服务可以通过水平扩展达到整体的高性能高并发,同时将越脆弱的资源放置在链路的越末端,访问的时候尽量将访问链接缩短,降低每次访问的资源消耗。服务之间直接restful模型使用http调用,或者redis,kafka类的消息中间件通信。单个服务直接使用nginx做负载集群,同时前后端分离,数据库分库分表等一整套分布式服务系统!
◂◍高并发服务器的逻辑处理瓶颈,该如何解决?
hash()%N是什么?
------------------
推荐阅读:
协议离婚,房子归女方,没过户,他欠下的债务,银行会封房子吗?
上一篇:社保“中人”是什么意思?
下一篇: 金陵十二钗正册都有谁?