Hystrix如何使用

整体要点图

Hystrix如何使用

 

HystrixNetflix开源的一款容错系统,能帮助使用者码出具备强大的容错能力和鲁棒性的程序。

 

 

Q1: fallback实现方式有几种?

 

继承HystrixCommand/HystrixObservableCommand 、HystrixCommand VS HystrixObservableCommand

 

HystrixCommand

HystrixObservableCommand

run()

construct()

创建的线程执行

调用程序线程执行

一个实例只能向调用程序发送(emit)单条数据

一个实例可以顺序发送多条数据

execute()queue()observe()toObservable()

observe()toObservable()没有execute()queue()

execute(以同步堵塞方式执行run()

 

queue():以异步非堵塞方式执行run()

 

observe():事件注册前执行run()/construct()

observe():事件注册前执行run()/construct()

toObservable():事件注册后执行run()/construct()

toObservable():事件注册后执行run()/construct()

 

 

Q2:什么情况下会触发fallback?

 

备注

Failure Type

Exception class

subject to fallback

方法抛异常

FAILURE

HystrixRuntimeException

YES

超时

TIMEOUT

HystrixRuntimeException

YES

在一定时间内,用户请求超过一定的比例失败时(timeout, failure, reject),断路器就会打开;短路器打开后所有请求直接走fallback

SHORT_CIRCUITED

HystrixRuntimeException

YES

线程池满reject,导致fallback

THREAD_POOL_REJECTED

HystrixRuntimeException

YES

信号量满reject,导致fallback

SEMAPHORE_REJECTED

HystrixRuntimeException

YES

 

BAD_REQUEST

HystrixBadRequestException

NO

 

 

SHORT_CIRCUITED

在一定时间内,用户请求超过一定的比例失败时(timeout, failure, reject),断路器就会打开;短路器打开后所有请求直接走fallback

参数设置

名称

类型

含义

默认值

circuitBreakerEnabled

Boolean

是否启用断路器

true

circuitBreakerErrorThresholdPercentage

Integer

错误百分比,超过该值打开断路器

50

circuitBreakerForceClosed

Boolean

强制断路器打开

false

circuitBreakerForceOpen

Boolean

强制短路器关闭

false

circuitBreakerRequestVolumeThreshold

Integer

10s中内最少的请求量,大于该值,断路器配置才会生效

20

circuitBreakerSleepWindowInMilliseconds

Integer

短路器打开后多长时间尝试关闭(Half open

5s

 

 

Q3:如何合并多个请求?

 

hystrix支持N个请求自动合并为一个请求,这个功能在有网络交互的场景下尤其有用,比如每个请求都要网络访问远程资源,如果把请求合并为一个,将使多次网络交互变成一次,极大节省开销。重要一点,两个请求能自动合并的前提是两者足够“近”,即两者启动执行的间隔时长要足够小,默认为10ms,即超过10ms将不自动合并。

 

Q4:策略如何配置?

HystrixCommandProperties

 

* --------------统计相关------------------*/

// 统计滚动的时间窗口,默认:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds)  

private final HystrixProperty metricsRollingStatisticalWindowInMilliseconds;  

// 统计窗口的Buckets的数量,默认:10个,每秒一个Buckets统计  

private final HystrixProperty metricsRollingStatisticalWindowBuckets; // number of buckets in the statisticalWindow  

// 是否开启监控统计功能,默认:true  

private final HystrixProperty metricsRollingPercentileEnabled;  

/* --------------熔断器相关------------------*/

// 熔断器在整个统计时间内是否开启的阀值,默认20。也就是在metricsRollingStatisticalWindowInMilliseconds(默认10s)内至少请求20次,熔断器才发挥起作用  

private final HystrixProperty circuitBreakerRequestVolumeThreshold;  

// 熔断时间窗口,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口

private final HystrixProperty circuitBreakerSleepWindowInMilliseconds;  

//是否启用熔断器,默认true. 启动  

private final HystrixProperty circuitBreakerEnabled;  

//默认:50%。当出错率超过50%后熔断器启动

private final HystrixProperty circuitBreakerErrorThresholdPercentage; 

//是否强制开启熔断器阻断所有请求,默认:false,不开启。置为true时,所有请求都将被拒绝,直接到fallback

private final HystrixProperty circuitBreakerForceOpen;  

//是否允许熔断器忽略错误,默认false, 不开启  

private final HystrixProperty circuitBreakerForceClosed;

/* --------------信号量相关------------------*/

//使用信号量隔离时,命令调用最大的并发数,默认:10  

private final HystrixProperty executionIsolationSemaphoreMaxConcurrentRequests;  

//使用信号量隔离时,命令fallback(降级)调用最大的并发数,默认:10  

private final HystrixProperty fallbackIsolationSemaphoreMaxConcurrentRequests;

/* --------------其他------------------*/

//使用命令调用隔离方式,默认:采用线程隔离,ExecutionIsolationStrategy.THREAD  

private final HystrixProperty executionIsolationStrategy;  

//使用线程隔离时,调用超时时间,默认:1秒  

private final HystrixProperty executionIsolationThreadTimeoutInMilliseconds;  

//线程池的key,用于决定命令在哪个线程池执行  

private final HystrixProperty executionIsolationThreadPoolKeyOverride;  

//是否开启fallback降级策略 默认:true  

private final HystrixProperty fallbackEnabled;  

// 使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作.默认:true  

private final HystrixProperty executionIsolationThreadInterruptOnTimeout;

// 是否开启请求日志,默认:true  

private final HystrixProperty requestLogEnabled;  

//是否开启请求缓存,默认:true  

private final HystrixProperty requestCacheEnabled; // Whether request caching is enabled.

 

HystrixCollapserProperties

 

//请求合并是允许的最大请求数,默认: Integer.MAX_VALUE  

private final HystrixProperty maxRequestsInBatch;  

//批处理过程中每个命令延迟的时间,默认:10毫秒  

private final HystrixProperty timerDelayInMilliseconds;  

//批处理过程中是否开启请求缓存,默认:开启  

private final HystrixProperty requestCacheEnabled;

 

HystrixThreadPoolProperties

 

/* 配置线程池大小,默认值10个 */

private final HystrixProperty corePoolSize;

/* 配置线程值等待队列长度,默认值:-1 建议值:-1表示不等待直接拒绝,测试表明线程池使用直接决绝策略+ 合适大小的非回缩线程池效率最高.所以不建议修改此值。 当使用非回缩线程池时,queueSizeRejectionThreshold,keepAliveTimeMinutes 参数无效 */

private final HystrixProperty maxQueueSize;

 

 

参考文献

 

https://www.jianshu.com/p/b9af028efebb

https://www.cnblogs.com/gaoyanqing/p/7470085.html