前提

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)

Hystrix完整配置列表的更多相关文章

  1. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

    1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的 ...

  2. [Nginx]Nginx的基本配置与优化1(完整配置示例与虚拟主机配置)

    ---------------------------------------------------------------------------------------- 完整配置示例: [ n ...

  3. [转载]Mybatis Generator最完整配置详解

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  4. thinkphp 完整配置config.php

    ThinkPHP的系统配置都采用数组形式,配置文件地址:Bin/Conf/config.php CHECK_FILE_CASE -- windows环境下面的严格检查大小写.     /* 项目设定 ...

  5. 夺命雷公狗ThinkPHP项目之----企业网站18之网站配置列表页的完成

    我们点击下配置列表即可查看我们列表页的配置信息了: 其实这个最简单了,首先我们先来完成他控制器的代码: public function lists(){ $mod = M('Conf')->se ...

  6. Nginx完整配置配置样例【官方版】

    我们主要参考nginx官方给出的完整配置的样例: https://www.nginx.com/resources/wiki/start/topics/examples/full/# 完整摘录如下: n ...

  7. Hystrix参数配置

    1.Hystrix参数配置文档  2.Hystrix参数配置示例 import org.springframework.beans.factory.annotation.Autowired; impo ...

  8. nginx.conf 集群完整配置

    ###############################nginx.conf 集群完整配置############################### #user nobody; # user ...

  9. java ant 编译打包build.xml完整配置范例

    java ant 编译打包build.xml完整配置范例 <?xml version="1.0" encoding="UTF-8" ?> <p ...

随机推荐

  1. 使用Wireshark成功解决JavaWeb项目的页面一直加载中的问题

    现象 打开 服务器页面 10.2.155.100,然后发现页面JS显示 加载中..F12浏览器看起来像是发起css等静态资源时卡死.一时定位还以为时 前端的问题. 解决过程 上服务器抓包: tcpdu ...

  2. MarkDown的常用语法

    个人比较喜欢Markdown的语法,常用来做一些笔记,下面就简单介绍一下它的语法. 概览 宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown ...

  3. mixin 扩展类的装饰

    1,步骤: 1,自定义装饰器 # 我们自定义的装饰器: def my_decorator_1(func): def wrapper(request, *args, **kwargs): print(' ...

  4. 小白学 Python(15):基础数据结构(集合)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  5. Node配合WebSocket做多文件下载以及进度回传

    起因 为什么做这个东西,是突然间听一后端同事说起Annie这个东西,发现这个东西下载视频挺方便的,会自动爬取网页中的视频,然后整理成列表.发现用命令执行之后是下面的样子: 心里琢磨了下,整一个界面玩一 ...

  6. Oracle 相关操作SQL

    SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,l.os_user_name,s.machi ...

  7. CSP2019游记

    第一轮 Day 0 今天正好学校开运动会,就从开幕式开始翘,申请来机房训练. 早上六点多到了机房. 然后果不其然,运动会又下雨了(祈雨大会).机房冷的一批. 今天中午没有午休时间,去食堂吃个饭就直接来 ...

  8. 【XSY1986】【BZOJ1455】罗马游戏

    就是一模板题. 合并就直接merge. pop就是将自己的值设为一,再将自己的左右儿子合并即可. 查询直接找到堆顶,输出. 模板左偏树 代码: #include<bits/stdc++.h> ...

  9. 【建站02】WordPress主题设置

    大家好,我是帝哥.相信很多朋友看了我上一篇文章的介绍之后已经可以搭建自己的个人网站了,但是网站的功能和美观程度都还是有所欠缺的,现在呢,再给大家大概的介绍一些如何美化自己的网站,当然了,这个过程也是很 ...

  10. [Flink]Flink1.6三种运行模式安装部署以及实现WordCount

    前言 Flink三种运行方式:Local.Standalone.On Yarn.成功部署后分别用Scala和Java实现wordcount 环境 版本:Flink 1.6.2 集群环境:Hadoop2 ...