Изоляция потока Hystrix на основе группового ключа или имени команды?

Я заметил, что у Hystrix есть две стратегии изоляции потоков: Thread и Semaphore.

По умолчанию Hystrix использует стратегию потоков и контролирует ее hystrix.threadpool.default.coreSize и из-за ca ommand с тем же групповым ключом будет использовать тот же пул потоков. Так что это основано на ключе группы.

Когда Hystrix использует семафорную стратегию, семафор сохранит в ConcurrentHashMap и ключ это имя команды, будет ли оно основано на имени команды?

Вот код:

/**
 * Get the TryableSemaphore this HystrixCommand should use for execution if not running in a separate thread.
 *
 * @return TryableSemaphore
 */
protected TryableSemaphore getExecutionSemaphore() {
  if (properties.executionIsolationStrategy().get() == ExecutionIsolationStrategy.SEMAPHORE) {
    if (executionSemaphoreOverride == null) {
      TryableSemaphore _s = executionSemaphorePerCircuit.get(commandKey.name());
      if (_s == null) {
        // we didn't find one cache so setup
        executionSemaphorePerCircuit.putIfAbsent(commandKey.name(), new TryableSemaphoreActual(properties.executionIsolationSemaphoreMaxConcurrentRequests()));
        // assign whatever got set (this or another thread)
        return executionSemaphorePerCircuit.get(commandKey.name());
      } else {
        return _s;
      }
    } else {
      return executionSemaphoreOverride;
    }
  } else {
    // return NoOp implementation since we're not using SEMAPHORE isolation
    return TryableSemaphoreNoOp.DEFAULT;
  }
}

Почему они имеют различие в объеме? Я пишу тестовый код, чтобы доказать это:

public static void main(String[] args) throws InterruptedException {
  int i = 0;
  while (i++ < 20) {
    final int index = i;
    new Thread(() -> {
      System.out.println(new ThreadIsolationCommand(index).execute());
      System.out.println(new SemaphoreIsolationCommand(index).execute());
    }).start();
  }
}

static class ThreadIsolationCommand extends HystrixCommand<String> {

  private int index;

  protected ThreadIsolationCommand(int index) {
    super(
        Setter
            .withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadIsolationCommandGroup"))
            .andCommandKey(HystrixCommandKey.Factory.asKey(String.valueOf(index)))
            .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
            )
            .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                .withCoreSize(10)
            )
    );
    this.index = index;
  }

  @Override
  protected String run() throws Exception {
    Thread.sleep(500);
    return "Hello Thread " + index;
  }

  @Override
  protected String getFallback() {
    return "Fallback Thread " + index;
  }
}

static class SemaphoreIsolationCommand extends HystrixCommand<String> {

  private int index;

  protected SemaphoreIsolationCommand(int index) {
    super(
        Setter
            .withGroupKey(HystrixCommandGroupKey.Factory.asKey("SemaphoreIsolationCommandGroup"))
            .andCommandKey(HystrixCommandKey.Factory.asKey(String.valueOf(index)))
            .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)
                .withExecutionIsolationSemaphoreMaxConcurrentRequests(10)
            )
    );
    this.index = index;
  }

  @Override
  protected String run() throws Exception {
    Thread.sleep(500);
    return "Hello Semaphore " + index;
  }

  @Override
  protected String getFallback() {
    return "Fallback Semaphore " + index;
  }
}

Эта команда с тем же групповым ключом и другим именем, результат:

Fallback Thread 9
Fallback Thread 1
Fallback Thread 8
Fallback Thread 19
Fallback Thread 20
Fallback Thread 14
Fallback Thread 3
Fallback Thread 13
Fallback Thread 17
Fallback Thread 10
Hello Thread 5
Hello Semaphore 17
Hello Semaphore 14
Hello Thread 2
Hello Semaphore 3
Hello Thread 7
Hello Thread 15
Hello Thread 4
Hello Semaphore 13
Hello Semaphore 1
Hello Thread 11
Hello Semaphore 20
Hello Semaphore 19
Hello Thread 18
Hello Thread 12
Hello Semaphore 8
Hello Semaphore 9
Hello Thread 6
Hello Thread 16
Hello Semaphore 10
Hello Semaphore 5
Hello Semaphore 2
Hello Semaphore 7
Hello Semaphore 15
Hello Semaphore 4
Hello Semaphore 11
Hello Semaphore 12
Hello Semaphore 6
Hello Semaphore 18
Hello Semaphore 16

Только стратегия Thread потерпела неудачу. Это правильно?

0 ответов

Другие вопросы по тегам