2016-02-23 9 views
6

Ich versuche den Unterschied zwischen HystrixCommand und HystrixObservableCommand zu verstehen. Der Grund dafür, dass ich verwirrt bin, ist, dass der HysterixCommand auch eine observe() - oder toObservable() -Methode hat, die heiß bzw. kalt beobachtbar ist. Was war also nötig, um HystrixObservableCommand zu erstellen? Wenn ich vollständig auf nicht blockierenden Anrufen arbeite, welche sollte ich verwenden? Warum?Unterschied zwischen HystrixCommand und HystrixObservableCommand

Antwort

9

Von dem Javadocs:

HystrixCommand

Dieser Befehl ist im Wesentlichen ein Sperrbefehl, sondern bietet eine beobachtbare Fassade verwendet, wenn mit beobachten()

HystrixObservableCommand

Dieser Befehl sollte für ein reines verwendet werden y nicht blockierendes Anrufmuster. Der Aufrufer dieses Befehls wird für das Observable-Objekt abonniert, das von der run() -Methode zurückgegeben wird.

Der Unterschied besteht darin, dass HystrixCommand standardmäßig eine blockierende Paradigma unterstützt, sondern bietet auch nicht-blockierende Verhalten durch von Observablen über eine Fassade, während HystrixObservableCommand speziell für eine nicht-blockierende Einrichtung umgesetzt wurde. Ich bin nicht ganz sicher, warum es in zwei Implementierungen aufgeteilt ist, aber ich würde vermuten, dass der Grund dafür ist, dass ursprünglich HystrixCommand nicht blockierend nicht unterstützt hat. Es wurde etwa a year or so after the original implementation hinzugefügt. Hätte einfach sauberer sein können, um eine rein nicht blockierende Hystrix-Klasse zu schreiben.

Wenn Sie nur mit nicht blockierenden Aufrufen arbeiten, sollten Sie wahrscheinlich HystrixObservableCommand verwenden. Ben Christensen, einer der Hystrix Devs, fasst es schön in this post:

Wenn Sie jedoch blockiert Anrufe wickeln, sollten Sie nur bleiben bei der Verwendung von HystrixCommand wie das ist, was es gebaut ist für und es standardmäßig Lauf alles in einem separaten Thread. Wenn Sie verwenden, gibt Ihnen HystrixCommand.observe() die gleichzeitige, asynchrone Komposition, nach der Sie suchen.

Der HystrixObservableCommand ist für das Umschließen asynchroner, nicht-blockierender Observables vorgesehen, die keine zusätzlichen Threads benötigen.

4

Zusätzlich zu der Antwort von Nick Defazio, eine Implementierung von HystrixObservableCommand Wrap Observable, die mehrere Elemente, während HystrixCommand, wird nie mehr als ein Element emittieren, auch beim Aufruf von observe() oder .toObservable() emittieren kann , die nur die einzelne wickeln Wert, der durch die run() Methode zurückgestimmt wird.