Parallelizing Hystrix Calls
Hystrix allows for safe parallel reactive calls to commands that enables you to call flaky services.
Join the DZone community and get the full member experience.
Join For FreeThis is more common sense than anything else. If you make calls to multiple remote systems and aggregate the results in some way, represented as a marble diagram here ...
... and you protect each of the remote calls using the awesome Hystrix libraries, then the best way to aggregate the results is using native rx-java operators.
So consider a Hystrix command — assume that such a command, in reality, would wrap around a remote call:
public class SampleRemoteCallCommand1 extends HystrixCommand<String> {
public SampleRemoteCallCommand1() {
super(Setter.withGroupKey(
HystrixCommandGroupKey.Factory.asKey("sample1"))
.andCommandKey(HystrixCommandKey.Factory.asKey("sample1")
)
);
}
@Override
protected String run() throws Exception {
DelayUtil.delay(700);
return "something";
}
@Override
protected String getFallback() {
return "error";
}
}
A service that would aggregate responses from multiple remote calls together would look like this:
SampleRemoteCallCommand1 command1 = new SampleRemoteCallCommand1();
SampleRemoteCallCommand2 command2 = new SampleRemoteCallCommand2();
Observable<String> result1Obs = command1.toObservable();
Observable<Integer> result2Obs = command2.toObservable();
Observable<String> result =
Observable.zip(result1Obs, result2Obs, (result1, result2) -> result1 + result2);
Essentially instead of synchronously executing the Hystrix command, we just use the "toObservable()" method to return a Rx-Java Observable representation of the result and use the different ways that Observable provides to aggregate the results together, in this specific instance the zip operator.
The main advantage of this approach is that we re-use the Hystrix threadpool that each command uses to run the tasks in parallel. Here is a sample project which demonstrates this: https://github.com/bijukunjummen/sample-hystrix-parallel
Just a note of caution — if your Hystrix command does not have a fallback and if you use this approach with one of the remote calls failing, you may see a memory leak in your app — I had opened an issue regarding this leak, which the excellent Netflix Team has already addressed.
Published at DZone with permission of Biju Kunjummen, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments