Hystrix底层原理

发布时间:2022-04-09 00:02:45 作者:yexindonglai@163.com 阅读(1171)

Hystrix 底层原理

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

Metrics 是什么

Metrics 是 Hystrix的指标数据收集器,全名为 HystrixMetrics,所有的请求不论请求失败成功都会上传至metrics,metrics就是用来记录请求状态的数据中心。是否开启熔断都是通过metrics中统计的请求失败率来计算的,就是滑动窗口时间内请求的失败率;

采集哪些数据?数据如何存储?数据如何上报?这都是Hystrix需要考虑的问题,Hystrix采用的是滑动窗口+分桶的形式来采集数据(原理还蛮复杂的,本文不不做讨论),但是我们可以知道他是如何统计数据的,以及何时进行熔断和降级,原理如下图:

Metrics 实时监控着断路器的数据,比如滑动事件窗口期为10秒:

  1. 当服务之间10秒内的请求数量小于20,正常执行请求
  2. 当服务之间10秒内的请求数量大于20,判断这20次请求中的失败率是否超过50%,超过50%则会开启断路器,也就是说,20个请求中有11个请求都失败了,就会开启断路器;
  3. 如果失败率小于等于50%,则正常执行请求
  4. 开启断路器后进入时长为5秒钟的窗口期,这5秒内不接受任何请求;
  5. 5 秒后进入半开状态,此状态时会尝试恢复服务:允许有且仅一个请求进入,一旦请求成功就关闭断路器。请求失败就到Open状态(这样再过5秒才能转到半开状态),也就是说,如果A服务触发了熔断,那么A服务的所有接口都会被拒绝访问一段时间,但是其他服务可以正常访问;流程如下:

以上流程对应SpringCloud中Hystrix的下面这几项配置:

  1. # 请求次数,默认20,这个值尽量设大一点,不然短路后很麻烦,会禁用服务一段时间;
  2. hystrix.command.default.circuitBreaker. requestVolumeThreshold=20
  3. # 时间窗口期,默认5000ms,当服务不可用时,会开启断路器,开启后,隔sleepWindowInMilliseconds时间后,熔断器会置为half-open(半开)状态,
  4. hystrix.command.default.circuitBreaker. sleepWindowInMilliseconds: 5000
  5. # 失败率,默认50%,超过这个概率则会触发熔断
  6. hystrix.command.default.circuitBreaker. errorThresholdPercentage: 50

关键字Hystrix