zoukankan      html  css  js  c++  java
  • Hystrix完整配置列表

    前提

    Hystrix在2018年11月20日之后已经停止维护,最后一个提交记录是:Latest commit 3cb2158 on 20 Nov 2018,最后一个正式版本为1.5.18。鉴于目前所在公司的技术栈是Spring Cloud,熔断和降级组件主要用的还是Hystrix,这里就Hystrix的完整列表做一个分析记录,方便以后可以随时查询。本文主要参考:Hystrix Configuration。其中,命令配置是针对HystrixCommand,主要包括命令执行(execution)配置、命令降级(fallback)配置、熔断器(circuit breaker)配置、度量统计(metrics)配置和请求上下文配置。

    HystrixCommandKey、HystrixCommandGroupKey和HystrixThreadPoolKey

    HystrixCommandKeyHystrixCommandGroupKeyHystrixThreadPoolKey三个KEY是HystrixCommand的重要标识。下面分别分析一下它们的含义。

    HystrixCommandKey

    HystrixCommandKeyHystrix命令的唯一标识,准确来说是HystrixCommand实例或者HystrixObservableCommand实例的唯一标识。它是必须的,如果不自定义配置,它会通过下面方式确定默认值:

    [HystrixCommand或者HystrixObservableCommand的具体子类].getClass().getSimpleName();
    

    编程式配置如下:

    HystrixCommandKey.Factory.asKey("Your Key");
    
    
    public Command() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Group Key"))
                    .andCommandKey(HystrixCommandKey.Factory.asKey("Command Key")));
    }
    

    注意一点:大部分Hystrix的配置都是和HystrixCommandKey绑定,所以HystrixCommandKey是比较重要的。

    HystrixCommandGroupKey

    HystrixCommandGroupKey是用于对Hystrix命令进行分组,分组之后便于统计展示于仪表盘、上传报告和预警等等,也就是说,HystrixCommandGroupKeyHystrix内部进行度量统计时候的分组标识,数据上报和统计的最小维度就是分组的KEY。HystrixCommandGroupKey是必须配置的,配置方式如下:

    HystrixCommandGroupKey.Factory.asKey("Group Key")
    
    public Command() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Group Key")));
    }
    

    HystrixThreadPoolKey

    HystrixThreadPoolKey主要标识用于监控、度量和缓存等等作用的HystrixThreadPool实例。一个HystrixCommand会和一个独立的HystrixThreadPool实例关联,也就是说一类HystrixCommand总是在同一个HystrixThreadPool实例中执行。如果不显式配置HystrixThreadPoolKey,那么会使用HystrixCommandGroupKey的值去配置HystrixThreadPoolKeyHystrixThreadPoolKey的配置方式如下:

    HystrixThreadPoolKey.Factory.asKey("ThreadPoolKey")
    
    public Command() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("xxx"))
                    .andCommandKey(HystrixCommandKey.Factory.asKey("YYY"))
                    .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolKey")));
    }
    

    命令执行(execution)配置

    隔离策略

    • execution.isolation.strategy

    隔离策略决定Hystrix命令执行的时候采用什么类型的策略进行依赖隔离。

    默认值 THREAD (见ExecutionIsolationStrategy.THREAD)
    可选值 THREAD,SEMAPHORE
    默认全局配置 hystrix.command.default.execution.isolation.strategy
    实例配置 hystrix.command.[HystrixCommandKey].execution.isolation.strategy

    执行隔离策略到底选择线程池(THREAD)还是信号量(SEMAPHORE)?文档中给出的建议是:

    使用HystrixCommand的时候建议用THREAD策略,使用HystrixObservableCommand的时候建议使用SEMAPHORE策略。

    使用THREAD策略让HystrixCommand在线程中执行可以提供额外的保护层,以防止因为网络超时导致的延时失败。

    一般情况下,只有这种特殊例子下HystrixCommand会搭配SEMAPHORE策略使用:调用的频次太高(例如每个实例每秒数百次调用),这种情况如果选用THREAD策略有可能导致超过线程隔离的上限(有可能需要太多的线程或者命令太多线程不足够用于隔离请求),这种情况一般是非网络请求调用。

    笔者想说的是:建议选用默认值,因为目前很少遇到使用信号量隔离的场景。

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.isolation.strategy=THREAD
    
    # 实例配置
    hystrix.command.CustomCommand.execution.isolation.strategy=THREAD
    

    是否允许超时

    • execution.timeout.enabled

    决定HystrixCommand#run()执行时是否允许超时,只有设置为true的时候,下面提到的“超时时间上限”才会有效。

    默认值 true
    可选值 true,false
    默认全局配置 hystrix.command.default.execution.timeout.enabled
    实例配置 hystrix.command.[HystrixCommandKey].execution.timeout.enabled
    建议(笔者备注) 保持选用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionTimeoutEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.timeout.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.execution.timeout.enabled=true
    

    超时时间上限

    • execution.isolation.thread.timeoutInMilliseconds

    HystrixCommand执行时候超时的最大上限,单位是毫秒,如果命令执行耗时超过此时间值那么会进入降级逻辑。这个配置生效的前提是hystrix.command.default.execution.timeout.enabled或者hystrix.command.[HystrixCommandKey].execution.timeout.enabled为true。

    默认值 1000
    可选值 -
    默认全局配置 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
    实例配置 hystrix.command.[HystrixCommandKey].execution.isolation.thread.timeoutInMilliseconds
    建议(笔者备注) 保持选用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionTimeoutInMilliseconds(1000)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
    
    # 实例配置
    hystrix.command.CustomCommand.execution.isolation.thread.timeoutInMilliseconds=1000
    

    超时是否中断

    此配置项决定HystrixCommand#run()执行的时候调用超时的情况下是否中断。

    默认值 true
    可选值 truefalse
    默认全局配置 hystrix.command.default.execution.isolation.thread.interruptOnTimeout
    实例配置 hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnTimeout
    建议(笔者备注) 保持选用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionIsolationThreadInterruptOnTimeout(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
    
    # 实例配置
    hystrix.command.CustomCommand.execution.isolation.thread.interruptOnTimeout=true
    

    取消是否中断

    • execution.isolation.thread.interruptOnCancel

    此配置项决定HystrixCommand#run()执行的时候取消调用的情况下是否中断。

    默认值 false
    可选值 truefalse
    默认全局配置 hystrix.command.default.execution.isolation.thread.interruptOnCancel
    实例配置 hystrix.command.[HystrixCommandKey].execution.isolation.thread.interruptOnCancel
    建议(笔者备注) 保持选用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionIsolationThreadInterruptOnFutureCancel(false)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.isolation.thread.interruptOnCancel=false
    
    # 实例配置
    hystrix.command.CustomCommand.execution.isolation.thread.interruptOnCancel=false
    

    最大并发请求上限(SEMAPHORE)

    • execution.isolation.semaphore.maxConcurrentRequests

    此配置项决定使用HystrixCommand#run()方法和ExecutionIsolationStrategy.SEMAPHORE隔离策略下并发请求数量的最高上限。

    默认值 10
    可选值 -
    默认全局配置 hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests
    实例配置 hystrix.command.[HystrixCommandKey].execution.isolation.semaphore.maxConcurrentRequests
    建议(笔者备注) 必须根据实际情况设定此值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
                            .withExecutionIsolationSemaphoreMaxConcurrentRequests(100)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=100
    
    # 实例配置
    hystrix.command.CustomCommand.execution.isolation.semaphore.maxConcurrentRequests=100
    

    命令降级(fallback)配置

    命令降级配置控制HystrixCommand#getFallback()的执行逻辑,所有命令降级配置对策略ExecutionIsolationStrategy.THREAD或者ExecutionIsolationStrategy.SEMAPHORE都生效。

    最大并发降级请求处理上限

    • fallback.isolation.semaphore.maxConcurrentRequests

    这个属性用于控制一个HystrixCommand#getFallback()实例方法在执行线程中调用的最大上限,如果超过此上限,降级逻辑不会执行并且会抛出一个异常。

    默认值 10
    可选值 -
    默认全局配置 hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests
    实例配置 hystrix.command.[HystrixCommandKey].fallback.isolation.semaphore.maxConcurrentRequests
    建议(笔者备注) 必须根据实际情况设定此值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withFallbackIsolationSemaphoreMaxConcurrentRequests(20)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=20
    
    # 实例配置
    hystrix.command.CustomCommand.fallback.isolation.semaphore.maxConcurrentRequests=20
    

    是否开启降级

    • fallback.enabled

    此属性控制当HystrixCommand执行失败之后是否调用HystrixCommand#getFallback()

    默认值 true
    可选值 falsetrue
    默认全局配置 hystrix.command.default.fallback.enabled
    实例配置 hystrix.command.[HystrixCommandKey].fallback.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withFallbackEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.fallback.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.fallback.enabled=true
    

    断路器(circuit breaker)配置

    断路器配置用于控制HystrixCircuitBreaker实例的行为。

    是否启用断路器

    • circuitBreaker.enabled

    此属性确定断路器是否用于跟踪健康状况,以及当断路器打开的时候是否用于短路请求(使请求快速失败进入降级逻辑)。

    默认值 true
    可选值 falsetrue
    默认全局配置 hystrix.command.default.circuitBreaker.enabled
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.enabled=true
    

    断路器请求量阈值

    • circuitBreaker.requestVolumeThreshold

    此属性设置将使断路器打开的滑动窗口中的最小请求数量。

    例如,如果值是20,那么如果在滑动窗口中只接收到19个请求(比如一个10秒的窗口),即使所有19个请求都失败了,断路器也不会打开。

    默认值 20
    可选值 -
    默认全局配置 hystrix.command.default.circuitBreaker.requestVolumeThreshold
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.requestVolumeThreshold
    建议(笔者备注) 建议保持默认值,如果部分接口不能容忍默认阈值可以单独配置

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerRequestVolumeThreshold(10)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.requestVolumeThreshold=10
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.requestVolumeThreshold=10
    

    断路器等待窗口时间

    • circuitBreaker.sleepWindowInMilliseconds

    此属性设置断路器打开后拒绝请求的时间量,每隔一段时间(sleepWindowInMilliseconds,单位是毫秒)允许再次尝试(也就是放行一个请求)确定是否应该关闭断路器。

    默认值 5000
    可选值 -
    默认全局配置 hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.sleepWindowInMilliseconds
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerSleepWindowInMilliseconds(5000)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.sleepWindowInMilliseconds=5000
    

    断路器错误百分比阈值

    • circuitBreaker.errorThresholdPercentage

    此属性设置一个错误百分比,当请求错误率超过设定值,断路器就会打开。

    默认值 50
    可选值 -
    默认全局配置 hystrix.command.default.circuitBreaker.errorThresholdPercentage
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.errorThresholdPercentage
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerErrorThresholdPercentage(50)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.errorThresholdPercentage=50
    

    注意:

    • 配置项circuitBreaker.requestVolumeThreshold针对错误请求数量。
    • 配置项circuitBreaker.errorThresholdPercentage针对错误请求百分比。

    是否强制打开断路器

    • circuitBreaker.forceOpen

    此属性控制断路器是否强制打开,强制打开断路器会使所有请求直接进入降级逻辑,也就是包裹在HystrixCommand#run()的逻辑不会执行。circuitBreaker.forceOpen属性和circuitBreaker.forceClosed属性互斥。

    默认值 false
    可选值 falsetrue
    默认全局配置 hystrix.command.default.circuitBreaker.forceOpen
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.forceOpen
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerForceOpen(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.forceOpen=true
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.forceOpen=true
    

    是否强制关闭断路器

    • circuitBreaker.forceClosed

    此属性控制断路器是否强制关闭,强制关闭断路器会导致所有和断路器相关的配置和功能都失效,HystrixCommand#run()抛出异常会正常进入降级逻辑。circuitBreaker.forceClosed属性和circuitBreaker.forceOpen属性互斥。

    默认值 false
    可选值 falsetrue
    默认全局配置 hystrix.command.default.circuitBreaker.forceClosed
    实例配置 hystrix.command.[HystrixCommandKey].circuitBreaker.forceClosed
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withCircuitBreakerForceClosed(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.circuitBreaker.forceClosed=true
    
    # 实例配置
    hystrix.command.CustomCommand.circuitBreaker.forceClosed=true
    

    度量统计(metrics)配置

    度量统计配置会对HystrixCommand或者HystrixObservableCommand执行时候的统计数据收集动作生效。

    滑动窗口持续时间

    • metrics.rollingStats.timeInMilliseconds
    默认值 10000
    可选值 -
    默认全局配置 hystrix.command.default.metrics.rollingStats.timeInMilliseconds
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingStats.timeInMilliseconds
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingStatisticalWindowInMilliseconds(10000)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingStats.timeInMilliseconds=10000
    

    滑动窗口Bucket总数

    • metrics.rollingStats.numBuckets
    默认值 10
    可选值 需要满足metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0,要尽量小,否则有可能影响性能
    默认全局配置 hystrix.command.default.metrics.rollingStats.numBuckets
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingStats.numBuckets
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingStatisticalWindowBuckets(100)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingStats.numBuckets=10
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingStats.numBuckets=10
    

    是否启用百分数计算

    • metrics.rollingPercentile.enabled
    默认值 true
    可选值 truefalse
    默认全局配置 hystrix.command.default.metrics.rollingPercentile.enabled
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingPercentileEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingPercentile.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingPercentile.enabled=true
    

    百分数计算使用的滑动窗口持续时间

    • metrics.rollingPercentile.timeInMilliseconds
    默认值 60000
    可选值 -
    默认全局配置 hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.timeInMilliseconds
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingPercentileWindowInMilliseconds(60000)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingPercentile.timeInMilliseconds=60000
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingPercentile.timeInMilliseconds=60000
    

    百分数计算使用的Bucket总数

    • metrics.rollingPercentile.numBuckets
    默认值 6
    可选值 满足metrics.rollingPercentile.timeInMilliseconds % metrics.rollingPercentile.numBuckets == 0,要尽量小,否则有可能影响性能
    默认全局配置 hystrix.command.default.metrics.rollingPercentile.numBuckets
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.numBuckets
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingPercentileWindowBuckets(6)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingPercentile.numBuckets=6
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingPercentile.numBuckets=6
    

    百分数计算使用的Bucket容量

    • metrics.rollingPercentile.bucketSize
    默认值 100
    可选值 -
    默认全局配置 hystrix.command.default.metrics.rollingPercentile.bucketSize
    实例配置 hystrix.command.[HystrixCommandKey].metrics.rollingPercentile.bucketSize
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsRollingPercentileBucketSize(100)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.rollingPercentile.bucketSize=100
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.rollingPercentile.bucketSize=100
    

    健康状态快照收集的周期

    • metrics.healthSnapshot.intervalInMilliseconds
    默认值 500
    可选值 -
    默认全局配置 hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds
    实例配置 hystrix.command.[HystrixCommandKey].metrics.healthSnapshot.intervalInMilliseconds
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withMetricsHealthSnapshotIntervalInMilliseconds(500)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds=500
    
    # 实例配置
    hystrix.command.CustomCommand.metrics.healthSnapshot.intervalInMilliseconds=500
    

    请求上下文配置

    请求上下文属性主要涉及到HystrixRequestContextHystrixCommand的使用。

    是否启用请求缓存

    • requestCache.enabled
    默认值 true
    可选值 truefalse
    默认全局配置 hystrix.command.default.requestCache.enabled
    实例配置 hystrix.command.[HystrixCommandKey].requestCache.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withRequestCacheEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.requestCache.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.requestCache.enabled=true
    

    是否启用请求日志

    • requestLog.enabled
    默认值 true
    可选值 truefalse
    默认全局配置 hystrix.command.default.requestLog.enabled
    实例配置 hystrix.command.[HystrixCommandKey].requestLog.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                            .withRequestLogEnabled(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.command.default.requestLog.enabled=true
    
    # 实例配置
    hystrix.command.CustomCommand.requestLog.enabled=true
    

    请求合成器配置

    请求合成器配置主要控制HystrixCollapser的行为。

    请求合成的最大批次量

    • maxRequestsInBatch
    默认值 Integer.MAX_VALUE
    可选值 -
    默认全局配置 hystrix.collapser.default.maxRequestsInBatch
    实例配置 hystrix.collapser.[HystrixCollapserKey].maxRequestsInBatch
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomHystrixCollapser extends HystrixCollapser<List<String>, String, String> {
    
        public CustomHystrixCollapser(Setter setter) {
            super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("CustomHystrixCollapser"))
                    .andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter()
                            .withMaxRequestsInBatch(10)));
        }
    
        @Override
        public String getRequestArgument() {
            return null;
        }
    
        @Override
        protected HystrixCommand<List<String>> createCommand(Collection<CollapsedRequest<String, String>> collapsedRequests) {
            return null;
        }
    
        @Override
        protected void mapResponseToRequests(List<String> batchResponse, Collection<CollapsedRequest<String, String>> collapsedRequests) {
    
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.collapser.default.maxRequestsInBatch=10
    
    # 实例配置
    hystrix.collapser.CustomHystrixCollapser.maxRequestsInBatch=10
    

    延迟执行时间

    • timerDelayInMilliseconds
    默认值 10
    可选值 -
    默认全局配置 hystrix.collapser.default.timerDelayInMilliseconds
    实例配置 hystrix.collapser.[HystrixCollapserKey].timerDelayInMilliseconds
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomHystrixCollapser extends HystrixCollapser<List<String>, String, String> {
    
        public CustomHystrixCollapser(Setter setter) {
            super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("CustomHystrixCollapser"))
                    .andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter()
                            .withTimerDelayInMilliseconds(10)));
        }
    
        @Override
        public String getRequestArgument() {
            return null;
        }
    
        @Override
        protected HystrixCommand<List<String>> createCommand(Collection<CollapsedRequest<String, String>> collapsedRequests) {
            return null;
        }
    
        @Override
        protected void mapResponseToRequests(List<String> batchResponse, Collection<CollapsedRequest<String, String>> collapsedRequests) {
    
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.collapser.default.timerDelayInMilliseconds=10
    
    # 实例配置
    hystrix.collapser.CustomHystrixCollapser.timerDelayInMilliseconds=10
    

    是否启用请求合成缓存

    • requestCache.enabled
    默认值 true
    可选值 truefalse
    默认全局配置 hystrix.collapser.default.requestCache.enabled
    实例配置 hystrix.collapser.[HystrixCollapserKey].requestCache.enabled
    建议(笔者备注) 建议保持默认值

    编程式配置:

    public class CustomHystrixCollapser extends HystrixCollapser<List<String>, String, String> {
    
        public CustomHystrixCollapser(Setter setter) {
            super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("CustomHystrixCollapser"))
                    .andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter()
                            .withTimerDelayInMilliseconds(10)));
        }
    
        @Override
        public String getRequestArgument() {
            return null;
        }
    
        @Override
        protected HystrixCommand<List<String>> createCommand(Collection<CollapsedRequest<String, String>> collapsedRequests) {
            return null;
        }
    
        @Override
        protected void mapResponseToRequests(List<String> batchResponse, Collection<CollapsedRequest<String, String>> collapsedRequests) {
    
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.collapser.default.requestCache.enabled=true
    
    # 实例配置
    hystrix.collapser.CustomHystrixCollapser.requestCache.enabled=true
    

    线程池配置

    Hystrix使用的是JUC线程池ThreadPoolExecutor,线程池相关配置直接影响ThreadPoolExecutor实例。Hystrix的命令执行选用了线程池策略,那么就是通过线程池隔离执行的,最好为每一个分组设立独立的线程池。笔者在生产实践的时候,一般把HystrixCommandGroupKeyHystrixThreadPoolKey设置为一致。

    核心线程数

    • coreSize
    默认值 10
    可选值 -
    默认全局配置 hystrix.threadpool.default.coreSize
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].coreSize
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withCoreSize(10)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.coreSize=10
    
    # 实例配置
    hystrix.threadpool.CustomCommand.coreSize=10
    

    最大线程数

    • maximumSize

    此属性只有在allowMaximumSizeToDivergeFromCoreSizetrue的时候才生效。

    默认值 10
    可选值 -
    默认全局配置 hystrix.threadpool.default.maximumSize
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].maximumSize
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withMaximumSize(10)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.maximumSize=10
    
    # 实例配置
    hystrix.threadpool.CustomCommand.maximumSize=10
    

    最大任务队列容量

    • maxQueueSize

    此属性配置为-1时使用的是SynchronousQueue,配置为大于1的整数时使用的是LinkedBlockingQueue

    默认值 -1
    可选值 -1或者大于0的整数
    默认全局配置 hystrix.threadpool.default.maxQueueSize
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].maxQueueSize
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withMaxQueueSize(-1)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.maxQueueSize=-1
    
    # 实例配置
    hystrix.threadpool.CustomCommand.maxQueueSize=-1
    

    任务拒绝的任务队列阈值

    • queueSizeRejectionThreshold

    maxQueueSize配置为-1的时候,此配置项不生效。

    默认值 5
    可选值 大于0的整数
    默认全局配置 hystrix.threadpool.default.queueSizeRejectionThreshold
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].queueSizeRejectionThreshold
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withQueueSizeRejectionThreshold(5)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.queueSizeRejectionThreshold=5
    
    # 实例配置
    hystrix.threadpool.CustomCommand.queueSizeRejectionThreshold=5
    

    非核心线程存活时间

    • keepAliveTimeMinutes

    allowMaximumSizeToDivergeFromCoreSizetrue并且maximumSize大于coreSize时此配置才生效。

    默认值 1
    可选值 大于0的整数
    默认全局配置 hystrix.threadpool.default.keepAliveTimeMinutes
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].keepAliveTimeMinutes
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withKeepAliveTimeMinutes(1)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.keepAliveTimeMinutes=1
    
    # 实例配置
    hystrix.threadpool.CustomCommand.keepAliveTimeMinutes=1
    

    是否允许最大线程数生效

    • allowMaximumSizeToDivergeFromCoreSize
    默认值 false
    可选值 truefalse
    默认全局配置 hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].allowMaximumSizeToDivergeFromCoreSize
    建议(笔者备注) 根据真实情况自行配置和调整

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withAllowMaximumSizeToDivergeFromCoreSize(true)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true
    
    # 实例配置
    hystrix.threadpool.CustomCommand.allowMaximumSizeToDivergeFromCoreSize=true
    

    线程池滑动窗口持续时间

    • metrics.rollingStats.timeInMilliseconds
    默认值 10000
    可选值 -
    默认全局配置 hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].metrics.rollingStats.timeInMilliseconds
    建议(笔者备注) 建议使用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withMetricsRollingStatisticalWindowInMilliseconds(10000)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
    
    # 实例配置
    hystrix.threadpool.CustomCommand.metrics.rollingStats.timeInMilliseconds=10000
    

    线程池滑动窗口Bucket总数

    • metrics.rollingStats.numBuckets
    默认值 10
    可选值 满足metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0,值要尽量少,否则会影响性能
    默认全局配置 hystrix.threadpool.default.metrics.rollingStats.numBuckets
    实例配置 hystrix.threadpool.[HystrixThreadPoolKey].metrics.rollingStats.numBuckets
    建议(笔者备注) 建议使用默认值

    编程式配置:

    public class CustomCommand extends HystrixCommand<String> {
    
        public CustomCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomCommand"))
                    .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                            .withMetricsRollingStatisticalWindowBuckets(10)));
        }
    
        @Override
        protected String run() throws Exception {
            return null;
        }
    }
    

    配置文件中(Properties)配置:

    # 下面配置二选一
    
    # 默认全局配置
    hystrix.threadpool.default.metrics.rollingStats.numBuckets=10
    
    # 实例配置
    hystrix.threadpool.CustomCommand.metrics.rollingStats.numBuckets=10
    

    原文链接

    (本文完 e-a-201890602 1:00 AM c-3-d)

    技术公众号(《Throwable文摘》),不定期推送笔者原创技术文章(绝不抄袭或者转载):

    娱乐公众号(《天天沙雕》),甄选奇趣沙雕图文和视频不定期推送,缓解生活工作压力:

  • 相关阅读:
    《Java从入门到放弃》入门篇:springMVC数据校验
    《Java从入门到放弃》入门篇:springMVC数据传递 (二)
    《Java从入门到放弃》入门篇:springMVC数据传递
    《Java从入门到放弃》入门篇:springMVC基本用法
    《Java从入门到放弃》入门篇:spring中AOP的配置方式
    《Java从入门到放弃》入门篇:spring中IOC的注入姿势
    《Java从入门到放弃》入门篇:Struts2的拦截器基本语法
    《Java从入门到放弃》入门篇:Struts2的常用验证方式(二)
    26计算限制的异步操作02-CLR
    26计算限制的异步操作01-CLR
  • 原文地址:https://www.cnblogs.com/throwable/p/11961016.html
Copyright © 2011-2022 走看看