8

Ich versuche, meinen Kopf um Hystrix wickeln und nach dem Lesen ihrer Dokumente immer noch eine Frage über seine Verwendung Muster.Hystrix Execution Patterns

Zum einen verstehe ich nicht die Use Case für wenn ihre Asynchronous verwenden Ausführung gegen ihre Reactive Ausführung. Der einzige Unterschied, den ich sehen kann, ist, dass die asynchrone Ausführung immer nicht blockierend ist, während Reaktive entweder blockieren oder nicht blockieren kann. Also meine eigentliche Frage ist:

  • Was ist der Unterschied zwischen synchroner und blockierender reaktiver Ausführung ?; und
  • Was ist der Unterschied zwischen asynchroner und nicht blockierender reaktiver Ausführung?

Antwort

20

Angenommen, Sie haben zwei Serviceanrufe A und B als HystrixCommand verpackt. Sie haben jetzt drei Optionen:

Verwenden Sie .execute(): reiner synchroner Anruf. Sie rufen die Methode auf und setzen Ihr Programm fort, sobald das Ergebnis angekommen ist. Die Gesamtausführungszeit Ihres Programms ist die Summe beider Aufrufe. Der Hauptfluss Ihres Programms ist sehr linear.

Verwenden Sie .queue(): erhalten Sie sofort eine Future für beide Befehle. Beide Serviceaufrufe werden parallel ausgeführt. Verwenden Sie dann .get(), um die Ergebnisse abzurufen. Diese Aufrufe mit Block bis das Ergebnis dort ist. Ihre gesamte Ausführungszeit ist schneller als zuvor: Ihre Ausführungszeit entspricht der Länge des längsten Serviceanrufs. Verwenden Sie dies, wenn Sie die Ergebnisse der beiden Dienste kombinieren möchten. Der Hauptfluss Ihres Programms ist immer noch linear, obwohl beide Aufrufe parallel ausgeführt werden.

Verwenden Sie .subscribe(): erhalten Sie sofort eine Observable für beide Befehle. Beide Serviceaufrufe werden parallel ausgeführt. Verwenden Sie dann .subscribe(), um einen Rückruf zu registrieren, um auf das Ergebnis zu reagieren, sobald es verfügbar ist. Dies ist sehr nützlich, wenn Sie die Ergebnisse nicht kombinieren wollen und nach dem Eintreffen auf die Ergebnisse von Service A und B unabhängig reagieren möchten. Der Hauptfluss Ihres Programms ist nicht linear, sondern reaktiv: Der Fluss des Programms wird innerhalb des Callbacks für jeden Befehl fortgesetzt.

Ich hoffe es hilft.

+0

Können Sie über die Eigenschaft maxQueueSize https://github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool erklären. Mein Verständnis aus dem Dokument ist, wenn Sie diese Eigenschaft angeben, die Warteschlange, die verwendet wird, um vom aufrufenden Thread an einen der Threads im Hystrix-Thread-Pool zu übergeben, die Größe von maxQueueSize? Wenn ja, wenn ich diesen Wert groß genug gebe, sollte ich jemals RejectedExecutionException erhalten? – timpham