Hystrix:为命令提升maxSemaphoreCount?

时间:2016-01-12 21:26:20

标签: java concurrency hystrix

我对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.
}

1 个答案:

答案 0 :(得分:1)

从Github问题#1048复制的答案:

这里的问题是属性如何应用的粒度。按命令键,该键有一个属性实例。该密钥的所有命令都获得该配置。这样做是为了减轻运营负担。如果有各种不同配置的命令实例(比如超时值),这将是一个非常难以操作,调整和理解的系统。

但是,这些值可以调整也很重要。 Hystrix提供Archaius集成,允许您在运行时修改信号量计数(或任何其他配置值)。执行此操作时,您正在修改单例属性实例,并且所有命令都会选择此值。有关此集成如何工作的详细信息,请参阅https://github.com/Netflix/Hystrix/wiki/Configuration