Hystrix简述

Hystrix的步骤:

  1. 构造HystrixCommand对象

  2. 执行命令

  3. 判断是否用缓存相应请求,默认不开启

  4. 判断是否断路器打开,如果打开直接fallback

  5. 判断线程池/信号量是否已满,如果已满则直接fallback

  6. 执行业务流程,如果超时或者异常则fallback

  7. 统计熔断器监控指标

  8. 执行fallback逻辑

  9. 返回结果

Hystrix熔断器的状态:OPEN,CLOSE,HALF_OPEN。

状态之间的转换:正常情况下是CLOSE状态,当失败率达到阈值则进入OPEN状态,经过sleepWindow时间后进入HALF_OPEN状态, 会放开流量尝试,如果成功进入CLOSE状态并将滑动窗口清楚重新计算;否则进入OPEN状态,重新计算sleepWindows时间。

比较重要的参数:

  1. Execution

    • execution.isolation.strategy

    隔离策略,THREAD和SEMAPHORE,默认是线程。

    • execution.isolation.thread.timeoutInMilliseconds

    超时时间,单位是毫秒,默认是1000

    • execution.timeout.enabled

    是否开启超时设置,默认是true

    • execution.isolation.thread.interruptOnTimeout

    已超时后是否中断HystrixCommand的执行

  2. Fallback

    • fallback.enabled

    是否开启fallback功能,默认是true

    • fallback.isolation.semaphore.maxConcurrentRequests

    使用信号量的时候才起作用,控制信号量的最大并发数

  3. Circuit Breaker

    • circuitBreaker.enabled

    是否开启断路器功能,默认是true

    • circuitBreaker.errorThresholdPercentage

    错误率,默认是50%,窗口内错误率超过这一指标则熔断器打开

    • circuitBreaker.requestVolumeThreshold

    窗口时间内至少要达到这个值才计算errorThresholdPercentage。默认值是20。如果一段时间内有19个请求全部失败或超时则熔断器也不会打开

    • circuitBreaker.sleepWindowInMilllseconds

    half_open的持续时间,默认值是5000,当熔断器开启5000ms之后,会尝试放一些请求执行,如果成功则关闭熔断器

    • circuitBreaker.forceOpen

    是否强制熔断器开启,如果true则直接进入fallback逻辑。默认值是false

    • circuitBreaker.forceClosed

    是否强制熔断器关闭,如果false则熔断器永远不会打开,默认值是false。forceOpen的优先级高于forceClosed

  4. Metrics

    • metrics.rollingStats.timeInMilliseconds

    熔断滑动窗口的时间长度。默认是10000,10s

    • metrics.rollingStats.numBuckets

    熔断滑动窗口中桶的数量。默认是10,要保证rollingStats.timeInMilliseconds % rollingStats.numBuckets == 0 如果并发量比较大建议每个桶的时间长度大于100ms。默认是1000ms

    • metrics.rollingPercentile.enabled

    是否开启统计滑动窗口。默认是true

    • metrics.rollingPercentileInMilliseconds

    统计滑动窗口的时间长度,默认是60000ms

    • metrics.rollingPercentile.numBuckets

    统计滑动窗口的桶的数量,默认是6. 同样窗口的时间长度要能够整除桶的数量

    • metrics.rollingPercentile.bucketSize

    统计滑动窗口的每个桶保存的执行时间最大值,如果一个桶的时间内超过这个值,则该桶重新开始统计

    • metrics.healthSnapshot.intervalInMilliseconds

    采集熔断器数据的间隔时间

  5. ThreadPool Properties

    • coreSize

    线程池的核心线程数,默认是10。

    • maxQueueSize

    线程池等待队列的最大长度,默认是-1。是-1时队列是SynchronousQueue,如果是正整数,队列是LinkedBlockingQueue。

    • queueSizeRejectionThreshold

    当等待队列的长度大于这一阈值时,拒绝后续请求进入队列。如果是-1则该属性不起作用。默认是5

    • allowMaximumSizeToDivergeFromCoreSize

    是否允许线程池开启最大线程数量,默认是false

    • maximumSize

    线程池最大线程数量,默认是10。必须让allowMaximumSizeToDivergeFromCoreSize为true才能生效。

    • keepAliveTimeMinutes

    释放空闲多余线程的时间。默认是1

    • metrics.rollingStats.timeInMilliseconds

    线程池统计指标的滑动窗口大小

    • metrics.rollingStats.numBuckets

    线程池统计指标滑动窗口的桶的大小

  6. 其他

    • thredapoolkey

    相同threadpoolkey的HystrixCommand共享同一个线程池,group-key

    • groupKey

    默认是类的SimpleName

    • commnadKey

    默认是方法名称

Written on March 20, 2019