前言
-
问题列表
跨系统、跨服务调用第三方接口时,第三方接口响应超时或者服务不可用,发生连锁故障进而导致雪崩效应。
-
举例说明
假设上游服务是A,下游服务是B,A调用B,B发生故障,导致请求线程持续等待,进而导致线程池线程和CPU资源耗尽,最终导致A无响应甚至整条调用链故障。
概念
-
熔断是什么?
熔断一般是指依赖的外部接口出现故障的情况断绝和外部接口的关系,强调的是服务之间的调用能实现自我恢复的状态。
-
作用
在服务的依赖调用中,被调用方出现故障时,熔断通过限制自己对外部系统的调用,起到节约响应时间、维护链路稳定的作用。
基本介绍
-
熔断流程图
-
考虑问题
-
针对不同的异常,定义不同的熔断后处理逻辑。
-
设置熔断的时长,超过这个时长后切换到HALF OPEN进行重试。
-
记录请求失败日志,供监控使用。
-
主动重试,比如对于connection timeout造成的熔断,可以用异步线程进行网络检测,比如telenet,检测到网络畅通时切换到HALF OPEN进行重试。
-
补偿接口,断路器可以提供补偿接口让运维人员手工关闭。
-
重试时,可以使用之前失败的请求进行重试,但一定要注意业务上是否允许这样做。
-
-
适用场景
-
服务故障或者升级时,让客户端快速失败;
-
失败处理逻辑容易定义;
-
响应耗时较长,客户端设置的read timeout会比较长,防止客户端大量重试请求导致的连接、线程资源不能释放。
-
三种状态
-
CLOSED
默认状态。断路器观察到请求失败比例没有达到阈值,断路器认为被代理服务状态良好。
-
OPEN
断路器观察到请求失败比例已经达到阈值,断路器认为被代理服务故障,打开开关,请求不再到达被代理的服务,而是快速失败。
-
HALF OPEN
断路器打开后,为了能自动恢复对被代理服务的访问,会切换到半开放状态,去尝试请求被代理服务以查看服务是否已经故障恢复。如果成功,会转成CLOSED状态,否则转到OPEN状态。
熔断方式
-
主调熔断
主调熔断是熔断的主要场景,在微服务中是结合服务注册和发现组件来使用的。主调通过服务发现组件来获取被调的实例,如果主调的失败达到了一个阈值,服务发现组件会熔断被调的实例。
-
被调熔断
被调熔断,被调实例获取当前的实例负载情况,如果 cpu/内存/io 等超过了一定的阈值,那么就会触发熔断,将抛弃进来的请求。此时熔断和限流比较像,一个是基于负载情况,一个是根据配置的阈值情况。
常用框架
功能对比
-
对比图
使用介绍
-
hystrix
<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.4.21</version> </dependency>
-
Resilience4j
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-circuitbreaker</artifactId> <version>1.3.1</version> </dependency>
断路器 resilience4j-circuitbreaker:超过故障率的熔断。
限流 resilience4j-ratelimiter:指定时间周期内,限制访问次数。
基于信号量的隔离 resilience4j-bulkhead:设置最大并发数量。
请求重试 resilience4j-retry:针对指定异常,进行重试。
限时 resilience4j-timelimiter:限制方法最大执行时长。创建流程
正常创建熔断器对象的过程是 “CircuitBreakerConfig -> CircuitBreakerRegistry -> CircuitBreaker”。
-
sentinel
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.2</version> </dependency>
DegradeSlot
这个 slot 主要针对资源的平均响应时间(RT)以及异常比率,来决定资源是否在接下来的时间被自动熔断掉。
参考链接
-
Hystrix
https://github.com/Netflix/Hystrix/wiki
-
熔断降级
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
-
限流熔断技术选型:从Hystrix到Sentinel
https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653550514&idx=1&sn=7b3adba358cbaa367eab9642db22215c
-
Re手册-工具篇 - Resilience4j服务熔断
https://segmentfault.com/a/1190000022908483
-
(四)Sentinel限流&熔断实践
https://zhuanlan.zhihu.com/p/455438260
-
circuitBreaker
https://github.com/hirudy/circuitBreaker
-
sds
https://github.com/didi/sds