高并发解决方案之熔断处理
高并发解决方案之熔断处理
- 前言
- 概念
- 基本介绍
- 三种状态
- 熔断方式
- 常用框架
- 功能对比
- 使用介绍
- 参考链接
前言
问题列表
跨系统、跨服务调用第三方接口时,第三方接口响应超时或者服务不可用,发生连锁故障进而导致雪崩效应。
举例说明
假设上游服务是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
高并发解决方案之熔断处理相关推荐
- Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...
JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...
- 互联网高并发解决方案相关面试题
高并发服务限流特技有哪些算法? 传统计算器算法,滑动窗口计数器算法,令牌桶算法和漏桶算法. 传统计数器限流算法有什么弊端? 传统计数器限流方式不支持高并发,存在线程安全问题.若大量访问请求集中在计数器 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
- [转]淘宝下单高并发解决方案
周末参加了@淘宝技术嘉年华 主办的技术沙龙, 感觉收获颇丰,非常感谢淘宝人的分享.这里我把淘宝下单高并发解决方案的个人理解分享一下.我不是淘宝技术人员,本文只是写自己的理解,所以肯定是会有一些出入的. ...
- 关于SQL SERVER高并发解决方案
现在大家都比较关心的问题就是在多用户高并发的情况下,如何开发系统,这对我们程序员来说,确实是值得研究,最近找工作面试时也经常被问到,其实我早有去关心和了解这类问题,但一直没有总结一下,导致面试时无法很 ...
- 打车业务下单高并发解决方案
简介: 打车业务下单高并发解决方案 前言 在技术领域有一条准则,即不存在银弹技术.在实际工作中,通常无法通过几项简单的技术组合就解决实际业务中各种场景下的复杂问题.虽然追求架构的简单简洁也是架构师的目 ...
- 高并发解决方案--负载均衡
高并发解决方案--负载均衡 1,什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首 ...
- 【java】 java 高并发解决方案和高负载优化方法
[java] java 高并发解决方案和高负载优化方法 参考文章: (1)[java] java 高并发解决方案和高负载优化方法 (2)https://www.cnblogs.com/lonelywo ...
- 数据库高并发解决方案(一)查询优化
数据库高并发解决方案(一)查询优化 参考文章: (1)数据库高并发解决方案(一)查询优化 (2)https://www.cnblogs.com/wanglijun/p/10879314.html 备忘 ...
最新文章
- 阿联酋gitex_航空公司网站不在乎您的隐私后续行动:阿联酋航空以以下方式回应我的文章:...
- Php-SPL库中的迭代器类详解(转)
- Matlab调用函数实现CIC滤波器
- 托管代码与非托管代码
- 腾讯云服务器搭建WampServer环境
- 标准PSO辨识NARMAX模型源码程序
- 【一雪前耻!】两种方法判断大小端模式
- react报Maximum update depth exceeded
- Django模型之Meta选项详解
- v-model数据绑定分析
- (原创)Python 自动化测试框架详解
- HDU.1007 Quoit Design
- JavaScript console.log导致错误:“不赞成在主线程上使用同步XMLHttpRequest…”
- C++ STL 一个简单的文件输入输出示例
- 下一代防火墙评测--网界
- Java给树加子节点个数统计
- 相机sd卡格式化后还能不能数据再恢复
- 阶乘很简单?恕我直言,阶乘相关的面试题你还真不一定懂!
- Openresty 安装luarocks
- Web3:开源文化下的技术创新