Hystrix断路器是如何工作的
前言
20181130,Hystrix已经不再维护,这里是学习记录。12月1日才完成,没有完成11月的诺言,捐款记录以上动弹。 https://my.oschina.net/floor/tweet/19421296
Hystrix是什么
Hystrix是一个java类库,提供了服务容错保护
遇到的问题
- 请求响应时间过长,造成资源不能被及时释放。短时巨量请求造成资源耗尽,最终造成系统无法响应。
- 系统中一个服务服务出现故障,影响其他系统,造成系统级联故障。
- 请求不受约束或者未进行批处理,系统会逐渐变慢失去响应 注 (资源可能是,线程,网络连接,内存等)
Hystrix解决方案
- 超时后取消与外部服务的连接;释放系统资源,并使系统响应 线程和网络使用受到线程池和信号量的限制。
- 当资源消耗到它们的约束时,之后的请求将失败,而不是排队
- 当发生故障时,可以在适当的时候使用fallback;
- 可以使用批处理请求;更有效地利用本地及外来服务资源
工作流程
官方工作流程图一共9步如下,逻辑简单。
- 创建对象HystrixCommand和HystrixObservableCommand对象
- 命令执行
- 缓存中是否有结果
- 断路器是否打开
- 信号量/线程池是否拒绝
- HystrixObservableCommand.construct()或者HystrixCommand.run()
- 计算断路器的健康度
- fallback处理
- 返回成功的响应
断路器原理
其原理说明如下:
- 假设请求量达到一定的阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())
- 假设错误百分比超过阈值错误百分比 (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())
- 满足其一,打开断路器。
- 当短路其打开,短路所有进过该短路器的请求。
- 一段时间后(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), 允许一个请求通过(此时短路器为半开状态),如果该请求成功,短路其设置为打开,否则将短路器设置为关闭,从1开始再进行判断。
依赖隔离
Hystrix使用“舱壁模式”。默认使用线程池。 为每一个依赖服务创建一个独立的线程池,这样如果一个依赖服务出现故障,只对该依赖服务的调用产生影响,不会拖累其他服务。如下图所示:
-
线程池隔离优点
-
当服务从失效恢复正常后,线程池会被清理,马上恢复健康的服务,而容器级别要满很多。
-
失败次数,延迟,超时,拒绝等指标,会快速反应出问题,结合Spring Cloud 可以实现动态刷新。
-
线程池内置了并发实现,为同步依赖服务构建异步访问。
请求合并
解决,通信占用和连接消耗问题。在一个很短的时间窗口(默认10ms)内对多个请求进行合并以批处理的方式发送请求。 缺点:
- 造成单个响应的延迟,如果单个响应是5ms,默认时间窗口是10ms,这个请求的响应就变为了15ms
- 用户需要实现批量化服务和处理,增加了一些成本。 请求合并示意图如下:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
vue权限路由实现的方法示例总结
使用全局路由守卫 实现 前端定义好路由,并且在路由上标记相应的权限信息 const routerMap = [ { path: '/permission', component: Layout, redirect: '/permission/index', alwaysShow: true, // will always show the root menu meta: { title: 'permission', icon: 'lock', roles: ['admin', 'editor'] // you can set roles in root nav }, children: [{ path: 'page', component: () => import('@/views/permission/page'), name: 'pagePermission', meta: { title: 'pagePermission', roles: ['admin'] // or you can only set roles in sub nav } }, { path: 'dir...
- 下一篇
Kubernetes集群搭建
0. 概要 使用kubeadm搭建一个单节点kubernets实例,仅供学习. 运行环境和软件概要如下: ~ 版本 备注 OS Ubuntu 18.0.4 192.168.132.152 my.servermaster.local/192.168.132.154 my.worker01.local Docker 18.06.1~ce~3-0~ubuntu k8s最新版(1.12.3)支持的最高版本, 必须固定 Kubernetes 1.12.3 目标软件 以上系统和软件基本是2018.11截止最新的状态, 其中docker需要注意必须安装k8s支持到的版本. 1. 安装步骤 关闭系交换分区 swapoff -a 安装运行时, 默认使用docker, 安装docker即可 apt-get install docker-ce=18.06.1~ce~3-0~ubuntu 安装kubeadm 一下命令和官网的命令一致, 但是是包源改为阿里云 apt-get update && apt-get install -y apt-transport-https curl -s http...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程