美文网首页
hystrix学习心得

hystrix学习心得

作者: wz的技术窝 | 来源:发表于2019-07-30 19:58 被阅读0次

1.相关介绍:

Hystrix 是世界最大在线影片租赁服务商Netflix开源,针对分布式系统的延迟

和容错库。该库由Java写成,项目源于Netflix API团队在2011年启动的弹性工

程项目

源代码: https://github.com/Netflix/Hystrix

相关使用文档:https://github.com/Netflix/Hystrix/wiki

2.为何使用hystrix:

1.复杂分布式架构:依赖多,某个服务会失败

2.某个依赖出现故障,应用被拖垮风险

3.高流量网站单一服务延迟,所有应用资源被耗尽风险(线程,队列,cpu等)

盗用官网一张图

如果依赖服务出现问题:

3.hystrix能做哪些事:

使用Hystrix对依赖服务进行异常情况下的隔离和降级,

同时配合Rpc框架(Dubbo,grpc,spring cloud)

对依赖服务的整理和监控工作

4.Hystrix如何解决依赖隔离

1).Hystrix用命令模式包装依赖调用逻辑

2).可配置依赖调用超时时间

3).每个依赖——一个小的线程池(或信号)

4).fallback(降级)逻辑

5).提供熔断器组件

6).近实时依赖的统计和监控

5.hystrix使用 :

引入包:

拦截器配置:

监控配置:

6.hystrix使用方式 :
关于HystrixCommand的使用方式,这里只介绍关于注解的方式,关于继承HystrixCommand的方式可以查看:https://github.com/Netflix/Hystrix/wiki/How-To-Use

HystrixCommand调用支持三种方式:

同步执行,异步执行,反应执行。

三种方式区别:

同步执行:当执行到注解方法时,程序会顺序执行。

相关代码:

异步执行:当执行到注解方法时,会并发异步执行,返回一个Future对象:

相关代码:

后面使用.get()方法来阻塞拿到结果。如果有多个方法时,执行时间就是

其中最长的一个服务的执行时间。

反应执行:当执行到注解方法时,返回一个观察者。

相关代码:

支持EAGER和LAZY模式。和同步异步执行的区别是,

当对多个方法之间的返回结果不需要做合并而是希望当

多个方法返回时触发一些事件时比较适合使用该模式。

7.异常处理和降级方法:

相关代码:

注意点:

•fallback应该和注解方法在同一类下

•fallback的返回值和参数列表应该和注解方法一致,如果需要异常,则在末尾添加Throwable参数,对访问修饰符无要求

•fallback方法上可以继续添加fallback

command和fallback只支持以下几种组合:

•sync command, sync fallback

•async command, sync fallback

•async command, async fallback

hystrix相关参数配置:

8.参数说明:

groupKey表示所属的group,一个group共用线程池默认值:getClass().getSimpleName();

commandKey 默认值:当前执行方法名

execution.isolation.strategy隔离策略,有THREAD和SEMAPHORE默认使用THREAD模式,以下几种可以使用SEMAPHORE模式:

•只想控制并发度

•外部的方法已经做了线程隔离

•调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)

execution.isolation.thread.timeoutInMilliseconds

超时时间默认值:1000

在THREAD模式下,达到超时时间,可以中断

在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时

设置标准:

有retry,99meantime+avg meantime

没有retry,99.5meantime

execution.timeout.enabled是否打开超时 

execution.isolation.thread.interruptOnTimeout是否打开超时线程中断THREAD模式有效

execution.isolation.semaphore.maxConcurrentRequests信号量最大并发度SEMAPHORE模式有效,默认值:10

fallback.isolation.semaphore.maxConcurrentRequestsfallback最大并发度默认值:10

circuitBreaker.requestVolumeThreshold熔断触发的最小个数/10s默认值:20

circuitBreaker.sleepWindowInMilliseconds熔断多少秒后去尝试请求默认值:5000

circuitBreaker.errorThresholdPercentage失败率达到多少百分比后熔断默认值:50

主要根据依赖重要性进行调整

circuitBreaker.forceClosed是否强制关闭熔断如果是强依赖,应该设置为true

coreSize线程池coreSize默认值:10

设置标准:qps*99meantime+breathing room

maxQueueSize请求等待队列默认值:-1

如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue

线程隔离的优点:

[1]:使用线程可以完全隔离第三方代码,请求线程可以快速放回。

[2]:当一个失败的依赖再次变成可用时,线程池将清理,并立即恢复可用,而不是一个长时间的恢复。

[3]:可以完全模拟异步调用,方便异步编程。

线程隔离的缺点:

[1]:线程池的主要缺点是它增加了cpu,因为每个命令的执行涉及到排队(默认使用SynchronousQueue避免排队),调度和上下文切换。

[2]:对使用ThreadLocal等依赖线程状态的代码增加复杂性,需要手动传递和清理线程状态。

NOTE: Netflix公司内部认为线程隔离开销足够小,不会造成重大的成本或性能的影响。

Netflix 内部API 每天100亿的HystrixCommand依赖请求使用线程隔,每个应用大约40多个线程池,每个线程池大约5-20个线程。

信号量隔离:

信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请),

如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销.

9.hystrix监控:

官方监控介绍:

https://github.com/Netflix/Hystrix/wiki/Dashboard

相关效果:

10.hystrix工作原理:

相关架构图(图1):

相关架构图(图2):

相关架构图(图3):

原理介绍 :

1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.

2:执行execute()/queue做同步或异步调用.

3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.

4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.

5:调用HystrixCommand的run方法.运行依赖逻辑

5a:依赖逻辑调用超时,进入步骤8.

6:判断逻辑是否调用成功

6a:返回成功调用结果

6b:调用出错,进入步骤8.

7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.

8:getFallback()降级逻辑.

  以下四种情况将触发getFallback调用:

 (1):run()方法抛出非HystrixBadRequestException异常。

 (2):run()方法调用超时

 (3):熔断器开启拦截调用

 (4):线程池/队列/信号量是否跑满

相关文章

网友评论

      本文标题:hystrix学习心得

      本文链接:https://www.haomeiwen.com/subject/fsjorctx.html