##Hystrix原理讲解

Hystrix原理详解

执行流程讲解:

  1. 通过配置或注解的方式构建Hystrix的Command对象,调用执行方法
  2. Hystrix会检查当前服务的熔断器是否开启,若开启,则执行降级逻辑Fallback方法。
  3. 若熔断器开关关闭,则Hystrix检查当前熔断器的线程池是否能接收新的请求,若线程池已满则拒绝请求,执行降级熔断逻辑,并上报Metrices。(注:不同熔断器可以共用一个线程池,线程池名称不同的话是相互隔离的,commandKey区分熔断器,threadPoolKey区分线程池)
  4. 若线程池接收请求,则Hystrix调用服务逻辑的run方法。
  5. 若服务执行失败则执行降级逻辑,并上传Metrices。
  6. 若服务执行超时则执行降级逻辑,并上传Metrices。
  7. 若执行成功则直接返回结果。

滑动时间窗口讲解

滑动时间窗口策略:不断收集数据,达到条件就熔断;熔断后拒绝所有请求一段时间
(sleepWindow);然后放一个请求过去,如果请求成功,则关闭熔断器,否则继续打开熔断器。
Hystrix原理详解
滑动事件窗口配置。
metrics相关配置:

  • metrics.rollingStats.timeInMilliseconds
    表示滑动窗口的时间(the duration of the statistical rolling window),默认10000(10s),也是熔断器计算的基本单位。
  • metrics.rollingStats.numBuckets
    滑动窗口的Bucket数量(the number of buckets the rolling statistical window is divided into),默认10. (注:每个Bucket中包含了请求的总数,失败数,超时数,拒绝数。滑动时间窗口内所有的Bucket的总的失败请求/总请求=失败率)
  • timeInMilliseconds和numBuckets可以计算出每个Bucket的时长。
    metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets 必须等于 0,否则将抛异常。
    熔断器的相关配置。
  • circuitBreaker.requestVolumeThreshold
    滑动窗口触发熔断的最小请求数。如果值是20,但滑动窗口的时间内请求数只有19,那即使19个请求全部失败,也不会熔断,必须达到这个值才行,否则样本太少,没有意义。
  • circuitBreaker.sleepWindowInMilliseconds
    这个和熔断器自动恢复有关,为了检测后端服务是否恢复,可以放一个请求过去试探一下。sleepWindow指的发生熔断后,必须隔sleepWindow这么长的时间,才能放请求过去试探下服务是否恢复。默认是5s
  • circuitBreaker.errorThresholdPercentage
    错误率阈值,表示达到熔断的条件。比如默认的50%,当一个滑动窗口内,失败率达到50%时就会触发熔断。

讲解:
所有的请求不论请求失败成功都会上传至metrics,metrics就是用来记录请求状态的数据中心。是否开启熔断都是通过metrics中统计的请求失败率来计算的,就是滑动窗口时间内请求的失败率。如滑动事件窗口为10秒,熔断器熔断阈值为50%,这10秒内来了100个请求,失败了30个,没有达到条件,若失败了60则失败率为60%会打开熔断器。但如果设置最小请求数为20,即使总请求数为19并且全失败也不会触发熔断,这是为了保护因网络连接导致的请求失败问题。
服务有可能因各种原因失败,所以会有重新可用的可能性,Hystrix都在sleepWindowInMilliseconds时间后放过一个请求,若请求成功则关闭熔断器,若失败则继续过一段时间放过请求。

相关文章: