熔断的原理

熔断
一、熔断是什么
日常生活中,保险丝是电路内的“脆弱链接”,而这正是它应有的特点。保险丝内通常只有一块很幼细的金属丝,就是阻抗部件;这金属丝会连接到电路中。当通过电路的电流过高,造成金属丝温度上升并熔掉,使得触点之间出现空隙,电路便会断开。这时电流便会停止,因而制止了电路过热的危险,也防止电气问题引起的火灾。
上面的“保险丝”就是“熔断器”;则规定时间内通过的流量超过这个熔断机制的上限,会自动断开,从而保护下游,使下游的影响下降到最低。
二、互联网的熔断指的是?
在大量微服务所构成的分布式系统中,某个基础服务的不可用,可能导致服务雪崩效应,即:依赖该基础服务的所有其它基础服务及级联的上游服务的级联性不可用故障。
熔断机制是防止服务雪崩的基本技术手段。通过检查依赖服务的失败状况并封装熔断逻辑,阻止在依赖服务暂时出现故障期间的错误反复不断地向上传播。基本思路是快速失败和 Fallback 机制。
三、设计熔断的目标是为了?
在未达到熔断要求时,正常调用依赖服务;在达到熔断要求时,调用指定的降级方法或抛出异常。这要求定义熔断要求,做一个熔断器设计。
针对这种需求,常用的一种处理方式是采用事件机制。将每一次依赖服务调用或者降级调用转换成一次事件,建立事件监听器进行事件统计,将事件统计结果传给熔断器,熔断器来决定下一次调用的走向。
四、如何实现?
熔断机制的实现思路主要包括:
熔断配置:失败事件的阈值、执行器配置等;失败事件包括超时、异常事件;
断路器:在失败事件达到指定阈值时,将依赖服务的调用熔断,采取降级策略;采取某种规则从熔断状态恢复到正常状态;
事件统计:在特定时间窗口内,统计依赖服务调用成功事件、失败事件(失败次数、失败比率等)、异常事件等;
事件机制:连接事件统计、断路器状态机、服务调用与熔断降级,串联成完整的流程。
重点是断路器和事件机制的设计实现。
1、断路器
熔断情形主要有:强制直接熔断;断路器开启、调用次数达到总数阈值且失败事件达到指定阈值(失败百分比、失败绝对次数等)。主要是断路状态机的设计实现。断路器状态机如图所示:
熔断的原理

断路状态机有三个状态: CLOSE (关闭),HALF-OPEN (半开),OPEN (开启)。
断路器默认是 CLOSE 状态,此时,正常调用依赖服务。
当调用次数达到总数阈值且失败事件的阈值达到指定值时,进入 OPEN 状态,开启降级逻辑;
当断路器位于 OPEN 状态时,将进入一段断路时间窗期,这个时间窗内的请求将不会转发给依赖服务,
而是转发给指定的降级逻辑;当断路器位于 OPEN 状态,且过了断路时间窗期,就会进入 HALF-OPEN 状态。
断路器使用称为 HALF-OPEN 状态的监视和反馈机制来了解依赖服务是否以及何时恢复。在 HALF-OPEN 状态,
根据规则将部分请求转发给依赖服务(默认是只重试第一次请求),若调用成功则进入 CLOSE 状态,
恢复调用依赖服务,若对依赖服务的调用超时或失败,则断路器保持在 OPEN 状态。
五、熔断的功能
1、异常处理(断路器可以依据异常类型来判断打开halfopen的时间)
2、日志记录(一个断路器应记录所有失败的请求)
3、可恢复性(应该把断路器配置成与受保护操作最匹配的恢复模式)
4、测试失败的操作(可周期性测试查验远程服务确定服务是否再次可用)
5、手动复位(如果一个故障恢复时间过长,可以配置手动复位的选项)
6、重试失败请求(一般记录好日志后,当断路器处于HALFOPEN时,在远程资源或服务重试)
六、测试熔断机制是否可靠
在spring boot工程里面有个组件叫hystrix
通过注解的方式
spring-cloud-starter-netflix-hystrix
在application.java的类名上加注解@EnableCircuitBreaker
如商品服务
在需要熔断的接口服务类名上加
@FeignClient(name=“goods-service”, fallback=GoodsServiceFB.class)
写降级实现类GoodsServiceFB.java去实现接口GoodsService接口(熔断打开时就调用此实现类的方法)
接下来就来个高并发访问吧,直接压挂商品服务,看是否调用降级方法。
日常测试中,如果要测试熔断机制,(单线程)在被测代码中sleep一段时间,
让系统误以为不可用从未调用降级方法。(多线程)在线程中获取当前线程Thread ,sleep一段时间。(粗暴简单)
Thread.currentThread().sleep(毫秒);

上一篇:java中为什么重写equals时必须重写hashCode方法?


下一篇:canvas生成海报toDataUrl报错,解决方案