写给自己-Hystrix断路器是如何工作的

前言

20181130,Hystrix已经不再维护,这里是学习记录。12月1日才完成,没有完成11月的诺言,捐款记录以上动弹。

https://my.oschina.net/floor/tweet/19421296

Hystrix是什么

Hystrix是一个java类库,提供了服务容错保护

遇到的问题

  • 请求响应时间过长,造成资源不能被及时释放。短时巨量请求造成资源耗尽,最终造成系统无法响应。
  • 系统中一个服务服务出现故障,影响其他系统,造成系统级联故障。
  • 请求不受约束或者未进行批处理,系统会逐渐变慢失去响应 注 (资源可能是,线程,网络连接,内存等)

Hystrix解决方案

  • 超时后取消与外部服务的连接;释放系统资源,并使系统响应 线程和网络使用受到线程池和信号量的限制。
  • 当资源消耗到它们的约束时,之后的请求将失败,而不是排队
  • 当发生故障时,可以在适当的时候使用fallback;
  • 可以使用批处理请求;更有效地利用本地及外来服务资源

工作流程

image

官方工作流程图一共9步如下,逻辑简单。

  1. 创建对象HystrixCommand和HystrixObservableCommand对象
  2. 命令执行
  3. 缓存中是否有结果
  4. 断路器是否打开
  5. 信号量/线程池是否拒绝
  6. HystrixObservableCommand.construct()或者HystrixCommand.run()
  7. 计算断路器的健康度
  8. fallback处理
  9. 返回成功的响应

断路器原理

image

其原理说明如下:

  1. 假设请求量达到一定的阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())
  2. 假设错误百分比超过阈值错误百分比 (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())
  3. 满足其一,打开断路器。
  4. 当短路其打开,短路所有进过该短路器的请求。
  5. 一段时间后(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), 允许一个请求通过(此时短路器为半开状态),如果该请求成功,短路其设置为打开,否则将短路器设置为关闭,从1开始再进行判断。

依赖隔离

Hystrix使用“舱壁模式”。默认使用线程池。

为每一个依赖服务创建一个独立的线程池,这样如果一个依赖服务出现故障,只对该依赖服务的调用产生影响,不会拖累其他服务。如下图所示:

image
  • 线程池隔离优点
  • 当服务从失效恢复正常后,线程池会被清理,马上恢复健康的服务,而容器级别要满很多。
  • 失败次数,延迟,超时,拒绝等指标,会快速反应出问题,结合Spring Cloud 可以实现动态刷新。
  • 线程池内置了并发实现,为同步依赖服务构建异步访问。

请求合并

解决,通信占用和连接消耗问题。在一个很短的时间窗口(默认10ms)内对多个请求进行合并以批处理的方式发送请求。

缺点:

  • 造成单个响应的延迟,如果单个响应是5ms,默认时间窗口是10ms,这个请求的响应就变为了15ms
  • 用户需要实现批量化服务和处理,增加了一些成本。 请求合并示意图如下:
    image

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

Chrome Extension in CLJS —— 搭建开发环境

前言  磨刀不误砍柴工,本篇将介绍如何搭建Chrome插件的ClojureScript开发环境。 具体工具栈:vim(paredit,tslime,vim-c...

29760
来自专栏Python自动化测试

postman插件的应用与实战(一)

在接口测试工具中,最好的应该是soapui,jmeter,postman,但是soapui需要安装和破解,当然也是有破解版的,但是不够灵活,jmete...

43430
来自专栏FreeBuf

Oracle人力资源管理系统PeopleSoft未授权远程代码执行漏洞解析

几个月前,我有幸参与几个Oracle PeopleSoft建设项目的安全审计,审计对象主要为PeopleSoft系列的人力资源管理系统(HRMS)和开发工具包(...

40450
来自专栏菩提树下的杨过

redis 学习笔记(6)-cluster集群搭建

上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,...

24050
来自专栏Gaussic

使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 顶

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

25310
来自专栏七夜安全博客

Django基础篇--搭建开发环境

18540
来自专栏纯洁的微笑

springboot(十九):使用Spring Boot Actuator监控应用

微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了...

37870
来自专栏BY的专栏

CocoaPods 公有仓库的创建(超详细)前言正文结语

35250
来自专栏前端之心

dig 命令洞察 DNS 解析过程

在上一篇文章,我们介绍了域名解析的过程,本章我们将介绍一个实用的工具---dig命令,通过dig命令我们可以查看 DNS 解析的过程,以便我们更好的理解 DNS...

81570
来自专栏偏前端工程师的驿站

Chrome Extension in CLJS —— 搭建开发环境

12920

扫码关注云+社区

领取腾讯云代金券