来自: https://yq.aliyun.com/articles/7443
微服务近年来很火很热,相关的文章汗牛充栋,关于架构设计本文就不作叙述了,只谈谈在分布式服务的容错方面怎么做。
1 什么是微服务
对于微服务,我们可以简单的理解成对一个服务解耦,以降低业务系统的复杂性,将服务系统中的功能进行拆分成多个轻量的子服务,各个自服务间通过RPC实现服务间的关联,这样做的好处是将业务简单化,每个子服务可以有自己独立的编程语言,模式等且能够独立维护,独立部署,功能复用。
2 为什么需要做服务隔离与熔断
由于微服务间通过RPC来进行数据交换,所以我们可以做一个假设:在IO型服务中,假设服务A依赖服务B和服务C,而B服务和C服务有可能继续依赖其他的服务, 继续下去会使得调用链路过长,技术上称1->N扇出。如果在A的链路上某个或几个被调用的子服务不可用或延迟较高,则会导致调用A服务的请求被堵住,堵住的请求会消耗占用掉系统的线程、io等资源,当该类请求越来越多,占用的计算机资源越来越多的时候,会导致系统瓶颈出现,造成其他的请求同样不可用,最终导致业务系统崩溃,又称:雪崩效应。
1->N扇形
雪崩效应
3 服务雪崩的原因
(1)某几个机器故障:例如机器的硬驱动引起的错误,或者一些特定的机器上出现一些的bug(如,内存中断或者死锁)。
(2)服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。
(3)人为因素:比如代码中的路径在某个时候出现bug
4 解决或缓解服务雪崩的方案
一般情况对于服务依赖的保护主要有3中解决方案:
(1)熔断模式:这种模式主要是参考电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
(2)隔离模式:这种模式就像对系统请求按类型划分成一个个小岛的一样,当某个小岛被火少光了,不会影响到其他的小岛。例如可以对不同类型的请求使用线程池来资源隔离,每种类型的请求互不影响,如果一种类型的请求线程资源耗尽,则对后续的该类型请求直接返回,不再调用后续资源。这种模式使用场景非常多,例如将一个服务拆开,对于重要的服务使用单独服务器来部署,再或者公司最近推广的多中心。
(3)限流模式:上述的熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。
5 熔断设计
在熔断的设计主要参考了hystrix的做法。其中最重要的是三个模块:熔断请求判断算法、熔断恢复机制、熔断报警
(1)熔断请求判断机制算法:使用无锁循环队列计数,每个熔断器默认维护10个bucket,每1秒一个bucket,每个blucket记录请求的成功、失败、超时、拒绝的状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
(2)熔断恢复:对于被熔断的请求,每隔5s允许部分请求通过,若请求都是健康的(RT<250ms)则对请求健康恢复。
(3)熔断报警:对于熔断的请求打日志,异常请求超过某些设定则报警
6 隔离设计
隔离的方式一般使用两种
(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)
(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)
7 超时机制设计
超时分两种,一种是请求的等待超时,一种是请求运行超时。
等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。
运行超时:直接可使用线程池提供的get方法
8 隔离与熔断代码实现
后续会放到github上
9 性能损耗测试
由于存在计数统计和线程切换等的开销,所以对每个请求会有一定的性能损耗,测试结果表明在线程池隔离模式中,平均一个请求的损耗在0.5ms以内。
测试方法:顺序请求,记录业务运行时间和隔离器运行业务的时间,请求数量500次。
变量解释:
单个请求耗时:为业务的运行时间(使用Thread.sleep()模拟);
隔离消耗=请求总用时-业务用时;
隔离评价消耗=隔离消耗/请求次数/
测试时间统计(单位ms):
单个请求耗时 |
请求总用时 |
业务用时 |
隔离消耗 |
隔离平均消耗 |
1 |
586 |
510 |
76 |
0.152 |
5 |
2637 |
2514 |
124 |
0.248 |
10 |
5248 |
5136 |
112 |
0.024 |
50 |
25261 |
25111 |
150 |
0.3 |
100 |
50265 |
50130 |
135 |
0.27 |
200 |
100657 |
100284 |
373 |
0.746 |
10 参考
在设计和实现的过程中参考了一些现有的设计和一些文章:
1、Hystrix官方文档:https://github.com/Netflix/Hystrix/wiki
2、Hystrix使用与分析:http://hot66hot.iteye.com/blog/2155036
3、Facebook文章:http://queue.acm.org/detail.cfm?id=2839461
4、Facebook文章:http://queue.acm.org/detail.cfm?id=2209336
4、 分布式服务容错模式和实践: http://www.atatech.org/articles/31559
相关推荐
Java springBlade微服务开发平台 是一个由商业级项目升级优化而来的微服务架构,采用Spring Boot 2.6 、Spring Clou,用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、...
• 支持Hystrix或者阿里巴巴Sentinel的两个熔断隔离限流降级 • 支持Spring Cloud Gateway、Zuul网关和微服务三大模块的灰度发布和路由等一系列功能 兼容的Spring相关技术栈 • 兼容Spring Cloud Edgware版,兼容...
Sentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩”效应,为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维护期,...
使用Mybatis拦截器实现对所有SQL的拦截,修改默认的Schema,从而实现多租户数据隔离的目的。 并且支持可插拔。 9、二级缓存 采用J2Cache操作缓存,第一级缓存使用内存(Caffeine),第二级缓存使用 Redis。 由于大量的...
本课程摒弃任何开发语言和任何框架来说明微服务的架构,你不会因为不懂某个...4-2:熔断、资源隔离、服务降级、超时时间控制、循环依赖 4-3:服务发现、负载均衡、API网关、故障转移 5:k8s概述 6:service mesh概述
微服务架构本身最最核心的保障高可用的措施,就是两点:一个是基于Hystrix做资源隔离以及熔断;另一个是做备用降级方案。如果资源隔离和降级都做的很完善,那么在双11这种高并发场景下,也许可能会出现个别的服务...
集成Sentinel从流量控制、熔断降级、系统负载等多个维度保护服务的稳定性。 注册中心、配置中心选型Nacos,为工程瘦身的同时加强各模块之间的联动。 使用Traefik进行反向代理,监听后台变化自动化应用新的配置文件。...
SpringBlade微服务开发平台基于SpringBlade的管理后台测试项目源码+项目说明.zip 【资源介绍】 采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI) 后端采用...
微服务架构与SOA架构区别 3 SpringCloud微服务框架 3 为什么选择SpringCloud 4 SpringCloud简介 4 服务治理SpringCloud Eureka 5 什么是服务治理 5 服务注册与发现 5 搭建注册中心 6 常用注册中心框架 6 ...
Sentinel 是阿里巴巴开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从流量控制、流量整形、依赖隔离、熔断降级、系统自适应保护等多个维度来帮助开发者保障微服务的稳定性。Sentinel 承接了...
内含功能"麻雀虽小五脏俱全",可以基于平台组件拓展很多产品应用场景的实现(其中涵盖微服务架构(监控+分布式配置+服务熔断+服务资源隔离+服务限流+反爬限制+多级缓存架构等)+大数据(实时计算与存储)+多种对象...
## 自研微服务框架,借鉴springCloud全家桶的微服务设计思想 #### 支持可插拔的客户端服务端注解 #### 支持三种负载设计: 1.@OrionTarget注解定向负载 2.客户端自定义负载策略 balanceStrategy,继承统一的接口...
服务熔断,隔离,与降级。采用配置持久化到nacs实现系统流控 Nacos :(支持部署)一个更容易整合的云原生应用的动态服务发现,配置管理和服务管理平台。注册中心和配置中心(系统采用多环境配置) 运河:实现...
含服务契约、编程模型、运行模型与通信模型四个部分,具备负载均衡、容错熔断、限流降级、调用链追踪等全面微服务治理能力,服务治理能力与业务逻辑隔离。它包含如下特性:多种开发风格,REST(JAX-RS、Spring MVC)...
3.使用Sentinel服务保护框架(服务降级、隔离、熔断、限流) 4.使用消息总线RocketMq B. 分布式基础设施环境构建 1.分布式任务调度平台XXL-Job 2.分布式日志采集系统ELK 3.分布式事务解决方案Seta 4.分布式锁解决方案...
11、项目分包明确,规范微服务的开发模式,使包与包之间的分工清晰。 SpringBlade 更新日志: v3.0.3 新增blade-develop的dockerfile 新增blade-develop推送docker配置 新增saber的dockerfile 新增kuboard k8s...
SpringBlade微服务开发平台采用前后端分离的模式,前端开源两个框架: (基于 React、Ant Design)、 (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:已推...
SpringBlade微服务开发平台 采用前后端分离的模式,前端开源两个框架: (基于 React、Ant Design)、 (基于 Vue、Element-UI) 后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架: ...
Discovery【探索】云原生微服务解决方案 如果您觉得本框架具有一定的参考价值和借鉴意义,请帮忙在页面右上角 [Star] 首席作者简介 Nepxion开源社区创始人 2020年阿里巴巴中国云原生峰会出品人 2020年被Nacos...