Hystrix简述
Hystrix的步骤:
-
构造HystrixCommand对象
-
执行命令
-
判断是否用缓存相应请求,默认不开启
-
判断是否断路器打开,如果打开直接fallback
-
判断线程池/信号量是否已满,如果已满则直接fallback
-
执行业务流程,如果超时或者异常则fallback
-
统计熔断器监控指标
-
执行fallback逻辑
-
返回结果
Hystrix熔断器的状态:OPEN,CLOSE,HALF_OPEN。
状态之间的转换:正常情况下是CLOSE状态,当失败率达到阈值则进入OPEN状态,经过sleepWindow时间后进入HALF_OPEN状态, 会放开流量尝试,如果成功进入CLOSE状态并将滑动窗口清楚重新计算;否则进入OPEN状态,重新计算sleepWindows时间。
比较重要的参数:
-
Execution
- execution.isolation.strategy
隔离策略,THREAD和SEMAPHORE,默认是线程。
- execution.isolation.thread.timeoutInMilliseconds
超时时间,单位是毫秒,默认是1000
- execution.timeout.enabled
是否开启超时设置,默认是true
- execution.isolation.thread.interruptOnTimeout
已超时后是否中断HystrixCommand的执行
-
Fallback
- fallback.enabled
是否开启fallback功能,默认是true
- fallback.isolation.semaphore.maxConcurrentRequests
使用信号量的时候才起作用,控制信号量的最大并发数
-
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
-
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
采集熔断器数据的间隔时间
-
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
线程池统计指标滑动窗口的桶的大小
-
其他
- thredapoolkey
相同threadpoolkey的HystrixCommand共享同一个线程池,group-key
- groupKey
默认是类的SimpleName
- commnadKey
默认是方法名称