高并发服务器逻辑处理瓶颈,如何解决?

西域战神 2019-03-21 13:39:52 ⋅ 883 阅读

高并发服务器逻辑处理瓶颈,如何解决?首先我们先了解什么是并发!

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。———来源《百度百科》

顾名思义,高并发就是在指定时间内,系统同时能够处理大量的请求(连接数)。

那么如何衡量高并发呢?

高并发衡量指标

响应时间:系统对请求做出响应的时间,即一个http请求返回所用的时间;
吞吐量:单位时间内处理的请求数量;
QPS(TPS):每秒可以处理的请求数或事务数;
并发用户数:同时承载正常使用系统功能的用户数量,即多少人同时使用,系统还能正常运行的用户数量;

根据上面衡量指标可以看到,提高并发能力必须解决如下几个问题:

  1. 如何提高并发连接数?

  2. 那么多的连接数怎么进行业务处理?

  3. 应用服务器的处理水平又该怎么提高?

  4. 如何使用微服务架构提升高并发逻辑?

别着急,这么多问题我们一个一个来分析解决!

1)、如何提高并发连接数?

如下图所示,常规的单一网络连接模型只能1个连接对应1个线程,压力都集中在内存,导致内存开销非常大,肯定支撑的连接数有限!(直接挂掉)

单一网络连接模型

有道是业务写的再好不如一台高性能服务器,这个锅不一定要开发人员背的哦!!!服务器的连接入口就那么大(比如tomcat只有几千的连接数),那么处理的能力也只局限于几千。

怎么解决呢?选用合适的网络IO模型或者selector,通过使用一个线程轮询或者事件触发的方式,能支持几万甚至更多的连接数,再配合上nginx做负载就更完美了。

2)那么多的连接数怎么进行业务处理?

大家都知道nginx只是具有反向代理和负载均衡的功能,并不能处理具体的业务逻辑,不能担当应用服务器来使用。例如webSphere 、tomcat和jetty等,但是我们可以利用nginx将接受到的大量连接通过均衡的方式(轮询,权重,hash)分配到不同的应用服务器中进行业务处理!


nginx负载

3)应用服务器的处理水平又该怎么提高?

要提高应用服务器的处理水平就要了解自己的应用服务器的瓶颈在哪里,一般有两个:

  1. 数据库压力:数据库是支撑产品业务的核心模块,系统的高并发的主要压力也是来源于数据库。处理方式有如下这些:
    数据库本身:建立有效索引、读写分离、双主互备、分库分表(sharding-jdbc等实现)等策略,提高数据库处理能力,减少压力!
    结合内存数据库:例如redid、memcached等,根据业务需要缓存一些数据字典、枚举变量和频繁使用数据等减少数据库访问次数,提升数据库处理能力。

web集群架构图

如上图web集群架构图所示:

  • 用nginx负载多台应用服务器;

  • 使用redid/memcached做业务缓存;

  • 再加上数据库集群;

组成了经典的web高并发集群架构。

  1. 代码中的业务逻辑:
    大家可以 参考阿里巴巴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做负载集群,同时前后端分离,数据库分库分表等一整套分布式服务系统!


前后端分离

具体的微服务架构搭建可以参考 架构实战篇:一个可供中小团队参考的微服务架构技术栈
前后端分离架构搭建可以参考 Java Web开发实战:聊一聊前后端分离架构

学习SpringBoot2.x的也可以关注下面内容:
微服务架构实战篇(六):Spring boot2.x 集成阿里大鱼短信接口详解与Demo
微服务架构实战篇(五):Spring boot2.x + Guava 并使用RateLimiter实现秒杀限流demo
微服务架构实战篇(四):Spring boot2.x + Mybatis +Druid监控数据库访问性能
微服务架构实战篇(三):Spring boot2.x + Mybatis + PageHelper实现增删改查和分页查询功能
微服务架构实战篇(二):Spring boot2.x + Swagger2 让你的API可视化
微服务架构实战篇(一):使用start.spring.io 构建SpringBoot2.x项目
Google guava工具类快速入门指南

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    “12306”是如何支撑百万QPS的?

    ! 12306 抢票,极限并发带来的思考 虽然现在...

    Nginx服务器高性能优化--轻松实现10万并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看

    Puma 5.2.1 发布,关注并发的 Ruby HTTP 服务器

    Puma 5.2.1 发布了。Puma 是一个简单、快速、线程化并且关注并发的 HTTP 1.1 服务器,适用于开发和生产中的 Ruby/Rack 应用。 本次更新内容包括: 修复 TCP

    架构设计原则 - 并发

    并发设计可以从以下几方面考虑:无状态拆分服务化消息队列数据异构缓存并发化1. 无状态无状态的应用容易进行水......

    微型Java开发框架Solon 1.1发布,QPS达10万+

    简介 Solon 是一个微型的Java开发框架。项目从2018年启动以来,参考过大量前人作品;历时两年,2700多次的commit;内核保持0.1m的身材,超的Web跑分,良好的使用体验

    并发下分布式事务的解决方案-MQ消息事务+最终一致性

    分布式事务分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上

    「转载」微服务分布式架构中,如何实现日志链路跟踪?

    背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,我们来看下面的图     上图

    Logstash 7.9.2 发布,开源服务端数据处理流程

    Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到你最喜欢的“存储库”中。目前,Logstash 7.9.2 已正式发布,该版本更新内容如下

    创业团队如何设计支撑百万并发的数据库架构?

    我们来聊一下对于一个支撑日活百万用户的并系统,他的数据库架构应该如何设计?

    Java并发解决方案:分布式应用限流实践

    任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。 之前文章:接口限流算法:漏桶算法&令牌桶算法

    你的老板逼你上微服务了吗?

    “ 这些年软件的设计规模越来越庞大,业务需求也越来越复杂,针对系统的性能、吞吐率、稳定性、扩展等特性提出了更的要求。   图片来自 Pexels可以说业务需求是软件架构能力的

    「千万级秒杀架构」千万级并发流量下,如何将流量串行化?

    流量串行化,是指在并发的场景下通过排队的方式将无序的并发流量整理成有序串行流量。大家都知道在 Redis 集群部署模式出现之前,市面上大多数 的 Redis 都是采用一主多从模式,写操作全部是由主

    Apache Traffic Control 5.1.2 发布,可扩分布式 CDN 解决方案

    Apache Traffic Control 5.1.2 现已发布。Apache Traffic Control 是一个分布式、可扩展的冗余解决方案,实现了现代 CDN 的所有核心功能,可

    Mir 2.2.0 发布,Ubuntu 显示服务器

    处理的复杂性:它提供了一个稳定,经过良好测试和性...

    小型系统如何“微服务”开发

    提到“微服务”,我相信网上各种“微服务”的演变案例都会给人一种“因大而分”的前提错觉,这可能会导致许多的“小白”产生没有机会接触“大项目”而对“微服务”可望而不可及也。

    微信小程序实战篇:如何解决https域名问题 ?

    开发自己的微信小程序绕不开https问题,为了能在小程序中调用我们自己的API服务请打开看一看吧!!!