2015-04-14 5 views
3

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

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 occured in the execution of "+getClass().getSimpleName()); 
    return scriptctx; 
} 
} 

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

+1

Если я неправильно понял код Hystrix, эти два вызова вы должны «HystrixCommandProperties».Setter() '' ничего не делают, просто создавая новый объект типа Setter и фактически не создавая никакого глобального свойства – arcuri82

ответ

1

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

Для ваших конкретных вопросов:

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

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

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

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

6

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"

1

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

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

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

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

Заменить с помощью ключа командной (который в этом вопросе спрашивают является: «Thread_Pool»).