一、微服务架构的高并发问题

背景:由于服务器的最大处理线程数都是有上线的,比如tomcat等。当系统某时刻出现高并发请求时,如秒杀活动等,在瞬间服务器可处理线程数瞬间使用完,线程资源耗尽。当后面的其他请求在过来时,请求将一直处于一段等待空闲释放线程的时间,在此时间内对用户的体验就是一直未响应状态。

如微服务中的雪崩效应,微服务A在对外提供服务时,需要调用微服务B,微服务B对A提供服务时,需要调用微服务C。如果服务C出现问题,对于服务器B和A都将无法释放请求占用的线程资源。如果请求较多,服务B和服务A服务器节点无法给其他服务DEF等其他服务在开启线程资源,间接的将影响到DEF等等。。如此下去整个微服务架构系统将会因为一个服务的故障导致整个架构瘫痪。

二、微服务架构的高并发问题复现

  • 服务提供者工程提供一个耗时2秒的订单查询接口。
  • 服务消费者工程提供一个订单查询接口,远程http调用提供者工程中的订单查询接口。
  • 服务消费者工程在提供一个本地的快速查询订单接口,不远程调用,也不做延迟。
  • 服务消费者工程对最大线程数做指定限制为最大10个线程。
  • 使用压测工具同时启动20个线程调用消费者工程快速查询接口,并循环50次,在运行过程中查看快速查询接口观察期相应速度

我们对消费者工程进行配置设置tomcat的最大线程数为10,即工程同时处理的最多线程数量为10个。然后使用Apache JMeter 压测工具进行模拟高并发请求订单查询接口。在请求过程中我们页面访问快速查询接口,查看其相应时间等效果。

1,提供者工程Controller 核心代码:

    @GetMapping("/payment/get/{id}")public CommonResult getPaymentById(@PathVariable("id") Long id){Payment payment = paymentService.getPaymentById(id);log.info(payment.toString());try{TimeUnit.SECONDS.sleep(2);}catch (Exception e){e.printStackTrace();}if(payment != null){return new CommonResult(0,"查询成功 server node:"+ip+":"+port,payment);}else{return new CommonResult(-9999,"查询失败,不存在信息 server node:"+ip+":"+port,null);}}

2,消费者工程Controller 核心代码

    @GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id") Long id){return restTemplate.getForObject("http://127.0.0.1:8001/payment/get/"+id,CommonResult.class);}@GetMapping("/consumer/fastget/{id}")public CommonResult<Payment> fastget(@PathVariable("id") Long id){System.out.println(Thread.currentThread().getName()+"------fastget------");return  new CommonResult(200,"fastget:"+id,null);}

消费者工程tomcat 最大线程数配置  application.yml

server:port: 80 #服务端口tomcat:max-threads: 10 #tomcat最大线程数

3,高并发压测环境安装

下载安装Apache Jmeter 下载地址:https://jmeter.apache.org/download_jmeter.cgi

运行启动:apache-jmeter-5.3\bin\jmeter.bat

4,启动压测程序并查看快速查询接口,可以看到在没有高并发时,秒返回的,在高并发下相应时间长达3秒。

三、高并发问题的解决策略

为了解决微服务中的资源耗尽或服务间强依赖导致的间接服务不可用处理的方式

  • 以服务的维度可以做

1,线程池隔离:对不同的服务分配单独的线程池,超过线程池数量的改服务请求进行线程池外等待。(下图1)

2,信号量隔离:对不同的服务设置固定的同时请求数量,超过了正在处理的数量时,直接进行错误返回(下图2)

  • 以线程维度可以做

1,服务隔离

顾名思义,系统将按照一定的原则划分,建立若干个相互独立、无强依赖当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其他模块,不影响整体的服务系统。

2,熔断降级

熔断即当下游服务因为请求压力大时,相应便慢或者出错时,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部保证整体的措施叫做熔断。

降级即在上游服务熔断了调用下游接口后,做的一个本地fallback的一个缺省回调返回,即容错处理。

3,服务限流

限流即限制服务的调用流量,一般来说服务的并发流量可以被测算。为了保证系统的稳固运行,服务一单到达需要限制的并发数阈值时,就需要限制调用以及采取措施完成限流目的。比如:推迟解决、拒绝解决、或者部分处理部分拒绝等。

SpringCloud Hystrix微服务架构的高并发问题与解决策略相关推荐

  1. 基于SpringCloud的微服务架构演变史?

    系统架构演变概述 在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由"App+后台服务&q ...

  2. 微服务架构与SpringCloud:微服务架构的特点

    微服务架构与Spring Cloud 近几年大家都在谈论云原生和微服务,例如 © 云原生技术能够帮助公司和机构在私有云.公有云和混有云等新型动态环境中,构建和运行可弹性扩展的应用. 微服务架构是一项在 ...

  3. SpringCloud Alibaba 微服务架构(十五)- 一文详解 Nacos 高可用特性

    前言 服务注册发现是一个经久不衰的话题,Dubbo 早期开源时默认的注册中心 Zookeeper 最早进入人们的视线,并且在很长一段时间里,人们将注册中心和 Zookeeper 划上了等号,可能 Zo ...

  4. 基于SpringCloud的微服务架构分析,神仙框架!

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  5. SpringCloud学习--微服务架构

    目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...

  6. 基于springCloud的微服务架构设计

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  7. SpringCloud Alibaba 微服务架构(十一)- 分布式事务解决方案及理论基础篇

    前言 在传统的单体应用架构中,例如经典的SSM,项目会采用分层架构模式:数据库访问层.业务逻辑层.控制层,从前端到后台所有的代码都是一个或者几个开发者去完成,该架构模式没有对我们业务逻辑代码实现拆分. ...

  8. 《SpringCloud Alibaba 微服务架构》专题(二十一)-Seat简介与安装

    文章目录 1.业务场景 2.Seata简介 3.Seata原理和设计 4.seata-server的安装与配置 Seata是Alibaba开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布 ...

  9. 19年BAT常问面试题汇总:JVM+微服务+多线程+锁+高并发性能

    1.Redis 面试题 1.什么是 Redis?. 2.Redis 的数据类型? 3.使用 Redis 有哪些好处? 4.Redis 相比 Memcached 有哪些优势? 5.Memcache 与 ...

最新文章

  1. 浅析正则表达式模式匹配的 String 方法
  2. c语言程序做四则运算还要余数,大整数四则运算 高质量C语言程序.doc
  3. AI先驱、A*算法发明者Nils Nilsson去世
  4. 深度学习: mAP (Mean Average Precision)
  5. java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
  6. PHP框架有没有前途?是否适用于复杂的web开发框架
  7. html5画折线图,canvas绘制折线图(仿echarts)
  8. 智能硬件(1)---十个智能硬件中文网站
  9. 字节AI LAB NLP算法二面凉+被捞后通过
  10. HTML5:一个拖拽网页元素的例子
  11. sqlite关于时间的处理
  12. flutter笔记:使用flutter webvie
  13. CentOS 7.0 关闭防火墙
  14. Microsoft Office 2021 简体中文正式版下载
  15. 安徽 计算机一级考试题库,计算机一级考试题库和答案
  16. 给自己分一个 MAC地址--locally administered address
  17. Shell脚本——Shell编程规范及变量
  18. 微软官方出了一款吊打WPS的PPT插件
  19. 【C基础】#if、if、#ifdef、#if defined之间的区别
  20. linux dns中文域名,中国互联网协会-中文域名的使用:DNS服务器配置

热门文章

  1. Idea 创建 web.xml 文件
  2. FTP下载文件中文名乱码FTP访问
  3. Java常见OutOfMemoryError
  4. java -jar命令引导启动Springboot项目的那点事
  5. Docker制作镜像(四)
  6. 9个元素换6次达到排序序列_排序总结:二大种,六小种排序方式
  7. java mail 接受QQ邮箱未读的邮件
  8. ambassador 学习七 Mapping说明
  9. KVM虚拟化安装配置(一)
  10. 将EnyimMemcached从.NET Core RC1升级至RC2