SystemDesign | 熔断器 | Hystrix

@toc:

  • Hystrix [hɪst’rɪks] 提供了哪些功能?
  • 使用 Hystrix API创建隔离器的步骤;
  • Hystrix 熔断的触发判定, 以及半开状态是怎样的?
  • Hystrix 提供的信号量隔离与线程池隔离的比较?

➤ Hystrix [hɪst’rɪks] 提供了哪些功能?

  • 提供线程池隔离 // 信号量隔离
  • 降级: 超时 or 资源不足(线程池,信号量), 降级后可返回降级接口的托底数据
  • 熔断: 错误率达到阈值进行熔断, 触发快速失败, 以及自动回恢复的功能

@ref 《亿级流量》

➤ 创建Hystrix 隔离/熔断器的 API和步骤?

  1. 创建 一个 HystrixCommand (cmd的参数有: groupKey, commandKey, threadPoolProperties)
  2. 同步调用: HystrixCommand.execute();
  3. 异步调用: Future f = HystrixCommand.queue();
  4. 降级(兜底数据): 覆写 HystrixCommand.getFallback()即可, 返回兜底数据
  5. 熔断: 需要设置的参数: circuitBreakerRequestVolumeThreshold, circuitBreakerErrorThresholdPercentage (触发熔断的最少错误的请求个数, 失败比例)
  6. 线程池属性: 和Java 线程池稍有不同, Hystrix定义了两个参数 maxQueueSize & queueSizeRejectionThreashold, 前者和后者分别是队列最大大小/队列拒绝上限, 后者可以灵活的设定

➤ Hystrix 熔断的触发判定, 以及半开状态是怎样的?

  • 使用滑动时间窗口来记录每个时间片内相关熔断计数指标及熔断器状态,时间片段称作为一个bucket,默认维护10个bucket,每1秒一个bucket,随着时间的滚动,最早的bucket抛弃,创建新的bucket到滑动窗口右边。
  • 每个blucket记录请求总数、成功数、超时数、拒绝数及熔断器状态,默认错误超过50%且10秒内超过20个请求进行中断拦截。
  • 当调用的失败比例高出阈值(可能意味着下游服务出现问题, 如果此时再继续正常流程的retry机制, 会进一步恶化下游服务), 触发熔断后, 熔断器开启并休眠一段时间, 此时再调用 HystrixCommand会返回 failfast , 休眠之后熔断器进入 half-open状态, 试探性放过一部分流量, 如果调用成功则关闭熔断器;

  • @ref 微服务熔断隔离机制及注意事项 - 用友云平台 - 博客园

  • @ref 使用hystrix保护你的应用 - Kris的博客 | Kris’ Blog

➤ Hystrix 提供的信号量隔离与线程池隔离的比较?

  • 除了线程池隔离, Hystrix 还提供了信号量隔离 : 可以创建一个 HystrixProperties, 并设置 IsolationStrategy=SEMAPHORE, 设置 MaxConcurrentRequest=N(信号量大小);
  • 调用者线程不会再往 Hystrix线程池提交任务, 而是直接在调用者线程池直接执行, (每调用一次-1, 调用完成+1);
  • 信号量隔离的作用是限制并发数, 更适合非网络请求;
  • 信号量隔离没有缓冲队列, 无法很好的应对突发流量的情况;