CARVIEW |
Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Description
The design of Hystrix 1.4 needs to evolve based on experience using the release candidates. This is the primary reason I haven't shipped a final 1.4.0 ... not having had the confidence in the APIs and reserving the right to change them. Discussions in #317, #315, #223 and internally at Netflix have shaped some changes currently committed but not yet released.
HystrixAsyncCommand
This is new. It is to provide non-blocking functionality like HystrixObservableCommand
but only support scalar responses. This is to address the nuances of fallback and timeout behavior with streaming results (see #317 and #315) and the issue with the generics on HystrixExecutable
not working with streaming.
Here are particular pieces of code worth reviewing:
run() ->
protected abstract HystrixFuture<R> run(); |
HystrixFuture -
public static final class HystrixFuture<R> { |
Promise -
public static final class Promise<R> { |
I’m not convinced I’ve got the HystrixFuture/Promise API or names correct. Functionally it seems correct though.
HystrixObservableCommand
This is functionally the same as HystrixObservableCommand
during all of the 1.4.0 release candidates, except it removes the execute
and queue
methods and doesn't implement HystrixExecutable
because of the generics issues (#315).
It also renames the run
and getFallback
methods to be more clear:
construct() -
Hystrix/hystrix-core/src/main/java/com/netflix/hystrix/HystrixObservableCommand.java
Line 191 in 62ac93f
protected abstract Observable<R> construct(); |
onFailureResumeWithFallback() -
Hystrix/hystrix-core/src/main/java/com/netflix/hystrix/HystrixObservableCommand.java
Line 208 in 62ac93f
protected Observable<R> onFailureResumeWithFallback() { |
I don’t like the name of the ‘onFailureResumeWithFallback’ but getFallback() doesn’t work. constructFallback() would work, but I was trying to communicate the fact that it is “resuming” after failure.
What do you think we should do here?
Here is a unit test showing the partial success with fallback use case:
Hystrix/hystrix-core/src/test/java/com/netflix/hystrix/HystrixObservableCommandTest.java
Line 6287 in 62ac93f
public void testExecutionPartialSuccessWithMoreIntelligentFallback() { |
Interfaces
I have had to massage the interfaces because HystrixObservableCommand can’t implement HystrixExecutable. The plugins need something that all 3 implement. They can do HystrixObservable but that seems too focused so I am using a marker interface (HystrixInvokable) despite not really liking marker interfaces.
It means the old stuff is deprecated because I can’t break the APIs. Not ideal but I think it’s working.
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixExecutable.java (This can’t be implemented by HystrixObservableCommand)
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixExecutableInfo.java
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixInvokable.java
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixObservable.java
Collapsers
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixObservableCollapser.java
https://github.com/Netflix/Hystrix/blob/62ac93f94c7248c2a5bac596344bac0f332fdf7f/hystrix-core/src/main/java/com/netflix/hystrix/HystrixCollapser.java
I still need to add HystrixAsyncCollapser.
Note that HystrixObservableCollapser is different than HystrixCollapser in how the functions are applied. AsyncCollapser will be similar but need to address a batch response type as a scalar value rather than a stream.
I would appreciate a review of the public APIs before locking this down and releasing 1.4.0 Final.