我对HystrixCommands
的工作原理的理解是,CommandProperties
可以在临时基础上进行更改。
但是,当我尝试使用IsolationSemaphoreMaxConcurrentRequests
property执行此操作时,我的命令配置更改似乎无法获取。
我是否有能力为已在同一密钥下指定配置的Hystrix命令提供其他配置?
在Hystrix的背景下,我是否缺少某些特定于隔离/信号量的东西?
以下是我的问题的一个例子。代码开始配置一个允许最多1个信号量的命令,然后将该数字最多碰到2个信号量。此时它会尝试使用两个信号量而失败,因为第二个信号量无法获取(我猜是因为允许的最大值仍为1?)。
HystrixCommandKey hystrixCommandKey = HystrixCommandKey.Factory.asKey("Command1");
// Note that we're initially setting the max concurrent requests to 1
HystrixCommandProperties.Setter maxConcurrentRequests1 = HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
.withExecutionTimeoutEnabled(false)
.withExecutionIsolationSemaphoreMaxConcurrentRequests(1);
final HystrixCommand.Setter hystrixCommandSetter = HystrixCommand.Setter
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Group"))
.andCommandKey(hystrixCommandKey)
.andCommandPropertiesDefaults(maxConcurrentRequests1);
class SleepOneSecond implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
return (new HystrixCommand<Boolean>(hystrixCommandSetter) {
@Override
protected Boolean run() throws Exception {
Thread.sleep(2_000);
return true;
}
}).execute();
}
}
ExecutorService threadPool = Executors.newFixedThreadPool(2);
threadPool.submit(new SleepOneSecond()).get();
// Bumping up the command settings to 2
hystrixCommandSetter.andCommandPropertiesDefaults(
maxConcurrentRequests1.withExecutionIsolationSemaphoreMaxConcurrentRequests(2));
// We should be allowed to have two concurrent commands now because we've bumped our semaphore cound up to two for
// these commands...
for (Future<Boolean> result : threadPool.invokeAll(ImmutableList.of(new SleepOneSecond(), new SleepOneSecond()))) {
result.get();
// Instead on the second result we end up with a:
// com.netflix.hystrix.exception.HystrixRuntimeException: Command1 could not acquire a semaphore
// for execution and no fallback available.
}
答案 0 :(得分:1)
从Github问题#1048复制的答案:
这里的问题是属性如何应用的粒度。按命令键,该键有一个属性实例。该密钥的所有命令都获得该配置。这样做是为了减轻运营负担。如果有各种不同配置的命令实例(比如超时值),这将是一个非常难以操作,调整和理解的系统。
但是,这些值可以调整也很重要。 Hystrix提供Archaius集成,允许您在运行时修改信号量计数(或任何其他配置值)。执行此操作时,您正在修改单例属性实例,并且所有命令都会选择此值。有关此集成如何工作的详细信息,请参阅https://github.com/Netflix/Hystrix/wiki/Configuration。