Reputation: 422
I am writing an application and I want to implement circuit breaker pattern. This is the Hystrix Command class I have written:
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;
}
}
I am not able to understand how to configure the number of threads, threshold time for circuit breaker and number of requests to handle.
Upvotes: 5
Views: 15801
Reputation: 144
It is best to set command properties before creating the command. Hystrix documentation specifically states this for some of the command properties. For example:
metrics.rollingStats.numBuckets: As of 1.4.12, this property affects the initial metrics creation only, and adjustments made to this property after startup will not take effect.
In other words, do not initialize this command property from inside the constructor as that is too late. I am using 1.4.3 and at least for this version, I found this to hold for all rolling metrics and circuit breaker properties. I have used ConfigurationManager to set these properties before initializing the command:
ConfigurationManager.getConfigInstance().setProperty("hystrix.command.<HystrixCommandKey>.circuitBreaker.requestVolumeThreshold, 30);
Replace with the command key (which in the question being asked is: "Thread_Pool").
Upvotes: 1
Reputation: 707
Hystrix uses Archaius for configuration management. The Archaius library allows for dynamic reloading of property values at runtime. Documentation on how to configure Archaius is here: https://github.com/Netflix/archaius/wiki/Users-Guide
If you want to configure Hystrix in code, you can use the Archaius ConfigurationManager class like this:
ConfigurationManager.getConfigInstance().setProperty(
"hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds",
500);
Note that the HystrixCommandKey part of the property name string is actually the name of the circuit breaker you set with the .andCommandKey() method of the Setter. So if you set the command key to be "MyCommand", the property key for timeout would actually be "hystrix.command.MyCommand.execution.isolation.thread.timeoutInMilliseconds"
Upvotes: 9
Reputation: 419
The complete list of configurations and the means are available here: https://github.com/Netflix/Hystrix/wiki/Configuration
For your specific questions:
configure the no. of threads use 'hystrix.threadpool.HystrixThreadPoolKey.coreSize'
threshold time for circuit breaker use 'hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds'
It would be better to read through the Configuration wiki to understand the structure and the usage of each property before attempting to setup.
Upvotes: 1