扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
一.什么是Hystrix?
成都创新互联总部坐落于成都市区,致力网站建设服务有成都网站设计、做网站、网络营销策划、网页设计、网站维护、公众号搭建、小程序设计、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!Hystrix,英文直译为豪猪。
在这里,指由Netflix(网飞)公司研发的断路器和降级的技术方案。
从2011年开始研发,至2018年底正式宣布进入维护模式,已经成熟完整且地提供了熔断、隔离、降级、请求合并、缓存、监控等功能。
二.Hystrix有哪些功能?
常用:
1.熔断(Circuit Break)
源自于股市的一种概念,达到一定条件,限制请求,限制一段时间后,开始恢复,恢复是逐步进行的;
2.隔离(IsoLation)
包装指定指令;上下文无关;可替换;线程或信号量
3.降级(FallBack)
当请求失败时能响应;快速;不会/不应报错;保证服务在一定程度上可用
不常用:
1.请求合并(Collapsing)
降低系统开销;总体平均性能提升;单次请求性能可能下降;须结合实际情况选择使用
2.缓存
相同参数直接返回;降低调用响应时间;降低开销;需要精细控制
3.监控(Monitor)
监控请求状态;定位问题所在;限制一段时间后,开始恢复,恢复是逐步进行的
三.为什么选择Hystrix
功能足够,性能足够,文档足够,支持足够
除了Hystrix外的选择
四.如何使用Hystrix?
开启Feign的Hystrix的支持(openFeign默认支持)
添加POM的依赖
开启Hystrix
五、Hystrix的一些概念
1.Commands
Command是Hystrix中的被隔离的一个最小指令。Hystrix的所有隔离、熔断、降级、缓存、合并、监控都是基于某个最小指令。每个Command都有其唯一的名字,可以用这个名字调整每个指令的对应属性。
绝大多数的配置,是针对于一个指令(Command)的,具体可以参阅Hystrix的官方文档说明。如果知道了一个指令(Command)的名字,那么可以针对于这个指令,调整它的配置。
如果Feign启用了Hystrix支持,那么产生的Command名字默认由feign.Feign#configKey(java.lang.Class, java.lang.reflect.Method)产生。
如果直接使用@HystrixCommand注解,那么Command的名字是被直接定义出来的。
2.ThreadPool
ThreadPool是Hystrix中的默认指令隔离方式。除此之外,还有信号量机制。
Hystrix中的线程池与Java的线程池概念类似。可以设定其最小值,大值,队列,回收速度。
当线程池达到大值后,再继续添加请求,会触发fallback,此fallback会被记录为请求错误。
线程池并非只有一个,对于Feign,每一组相同name的client属于同一个组,默认情况下,同一个组共享同一个线程池,也可以修改指定的指令(Commond)使用指定的线程池。
3.Circuit Breaker
Circuit Breaker(断路器)是Hystrix中的核心功能。断路器有开启、关闭、半开状态。
断路器(Circuit Breaker)的开启条件:在关闭状态下,首先要达到最小请求数,其次,这些请求中,请求错误的比例达到设定值,那么才会开启。
断路器开启后,所有请求都会直接降级(fallback)。
断路器开启后,经过一段时间的“休眠”,进入半开状态,会有一个指令进行实际请求,如果这个请求成功,那么断路器会关闭。否则,断路器继续打开。
如果需要,断路器可以禁用,也可以强行打开或关闭。
六.Hystrix如何工作?
例子:
设定总请求时间窗口为10秒,分为10个bucket,即,每个计数时间段为1秒。
设定请求计数门槛为20,断路器开启百分比为60%,断路器“休眠”时间5秒。
线程池容量40。
七.Hystrix有哪些坑?
1.如何精确设定Hystrix的参数?
通过设定对应指令(Command)的参数,可以覆盖默认的default参数。具体的参数配置可以参考官网。
2.指令使用哪个线程池,由什么决定?
每个Hystrix指令,都有一个对应的group,group在监控中是一个最小单元,默认情况下,此指令的线程池与group对应,每个group有唯一对应的线程池。也可以通过配置threadPoolKeyOverride,进行单独设定。
3.那么,指令使用哪个group呢?
对于Feign,group的名字默认是FeignClient注解的name值,可以通过调整feign.hystrix.SetterFactory来调整。
对于HystrixCommand注解,group的名字可以直接指定。
4.线程池方式下,hystrix如何计算是否开启断路器?
在单位时间内,如果请求达到一定数量,且失败比例高于设定值,则开启断路器。
单位时间由
参数: metrics.rollingStats.timeInMilliseconds
参数: metrics.rollingStats.numBuckets
共同指定,两者能整除时,单位时间为两者的商。
最低计算数由circuitBreaker.requestVolumeThreshold决定
最低失败比例由circuitBreaker.errorThresholdPercentage决定
5.hystrix线程池如何调优?
按官方文档,线程池中coreSize的建议值为
请求的qps*99线执行时间+预留空间
例如,某请求预估每秒请求300次,执行时间为200ms,
则coreSize应为300*0.2+10=70, 默认的coreSize为10
对于Feign,每个name对应相同的group,相同group默认使用同一个线程池,如果有多个调用量较小的微服务被调用端,可以考虑让他们共享同一个线程池。同理,反则反之,如果FeignClient的某个方法(对应一个指令Command)调用量较大,也可以给这个指令设置独享的线程池。
于Feign,每次请求,只要对应的http请求没有结束,线程是一直被占用的,请尽量保证快速释放线程资源。
此外,通过调整maxQueueSize,在一定程度上,可以达到“削峰填谷”作用。但需注意的是,等待执行也会被timeout处理。
6.FeignClient创建的Hystrix请求是如何包装的?
大部分情况下:
1.Sleuth层(如果有)
2.Hystrix层(如果有)
3.Ribbon层(如果有)
4.client层(必有,n选1)
因为Hystrix是包装在Ribbon层和client之上,所以超时和线程池会有一些微妙的关系
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流