Skip to content

Hystrix 1.4 API Design Review #321

@benjchristensen

Description

@benjchristensen

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 -

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() -

protected abstract Observable<R> construct();

onFailureResumeWithFallback() -
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:

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions