Hystrix如何使用
整体要点图
Hystrix是Netflix开源的一款容错系统,能帮助使用者码出具备强大的容错能力和鲁棒性的程序。
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