Конфигурация 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
По вашим конкретным вопросам:
настроить нет. потоков использовать 'hystrix.threadpool.HystrixThreadPoolKey.coreSize'
пороговое время для использования автоматического выключателя 'hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds'
- нет. запросов для обработки. Это немного сложно. Но макс. количество одновременных потоков равно числу нет. запросов для обработки.
Было бы лучше ознакомиться с вики-конфигурацией, чтобы понять структуру и использование каждого свойства, прежде чем пытаться выполнить настройку.