Конфигурация Hystrix для автоматического выключателя в Java

Я пишу приложение и хочу реализовать схему автоматического выключателя. Это класс команд Hystrix, который я написал:

public class HystrixCommandNextGen extends HystrixCommand<ScriptContext> {

    private ScriptContext scriptctx;
    private ScriptFactory scriptFactory;
    private ScriptContext responseContext = null;

    private Logger logger = LoggerFactory.getLogger(HystrixCommandNextGen.class);

    public HystrixCommandNextGen(ScriptContext scriptctx, ScriptFactory scriptFactory) {
        super(
            Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Thread_Pool"))
            .andCommandKey(HystrixCommandKey.Factory.asKey(scriptctx.getExecutionData(ExecutionParam.SCRIPTNAME)))
        );
        this.scriptctx = scriptctx;
        this.scriptFactory = scriptFactory;

        HystrixCommandProperties.Setter().withCircuitBreakerEnabled(true);
        HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(150);
    }

    @Override
    protected ScriptContext run() throws Exception {
        scriptFactory.execute(scriptctx);
        return scriptctx;
    }

    @Override
    protected ScriptContext getFallback() {
        logger.error("FI is not responding: Error occurred in the execution of " + getClass().getSimpleName());
        return scriptctx;
    }
}

Я не могу понять, как настроить количество потоков, пороговое время для автоматического выключателя и количество запросов для обработки.

3 ответа

Hystrix использует Archaius для управления конфигурацией. Библиотека Archaius позволяет динамически перезагружать значения свойств во время выполнения. Документация по настройке Archaius находится здесь: https://github.com/Netflix/archaius/wiki/Users-Guide

Если вы хотите настроить Hystrix в коде, вы можете использовать класс Archaius ConfigurationManager следующим образом:

ConfigurationManager.getConfigInstance().setProperty(
  "hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds", 
  500);

Обратите внимание, что часть HystrixCommandKey строки имени свойства фактически является именем прерывателя цепи, установленного с помощью метода.andCommandKey() метода Setter. Таким образом, если вы установите командный ключ на "MyCommand", ключ свойства для тайм-аута будет на самом деле "hystrix.command.MyCommand.execution.isolation.thread.timeoutInMilliseconds"

Лучше всего установить свойства команды перед ее созданием. В документации Hystrix конкретно указано это для некоторых свойств команды. Например:

metrics.rollingStats.numBuckets: Начиная с версии 1.4.12, это свойство влияет только на первоначальное создание метрик, и изменения, внесенные в это свойство после запуска, не вступают в силу.

Другими словами, не инициализируйте это свойство команды из конструктора, так как это слишком поздно. Я использую 1.4.3 и, по крайней мере, для этой версии, я обнаружил, что это относится ко всем метрикам прокатки и свойствам автоматического выключателя. Я использовал ConfigurationManager для установки этих свойств перед инициализацией команды:

ConfigurationManager.getConfigInstance().setProperty("hystrix.command.<HystrixCommandKey>.circuitBreaker.requestVolumeThreshold, 30);

Замените ключом команды (который в задаваемом вопросе является: "Thread_Pool").

Полный список конфигураций и средств доступен здесь: https://github.com/Netflix/Hystrix/wiki/Configuration

По вашим конкретным вопросам:

  1. настроить нет. потоков использовать 'hystrix.threadpool.HystrixThreadPoolKey.coreSize'

  2. пороговое время для использования автоматического выключателя 'hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds'

  3. нет. запросов для обработки. Это немного сложно. Но макс. количество одновременных потоков равно числу нет. запросов для обработки.

Было бы лучше ознакомиться с вики-конфигурацией, чтобы понять структуру и использование каждого свойства, прежде чем пытаться выполнить настройку.

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