Was ist das von Hystrix verwendete Schottmuster?

103

Hystrix, eine Netflix-API für Latenz und Fehlertoleranz in komplexen verteilten Systemen, verwendet die Bulkhead- Pattern-Technik zur Thread-Isolierung. Kann jemand bitte näher darauf eingehen.

Sashank
quelle

Antworten:

192

Allgemeines

Im Allgemeinen besteht das Ziel des Schottmusters darin, Fehler in einem Teil eines Systems zu vermeiden, um das gesamte System herunterzufahren. Der Begriff stammt von Schiffen, bei denen ein Schiff in separate wasserdichte Abteile unterteilt ist, um einen einzigen Rumpfbruch zu vermeiden und das gesamte Schiff zu überfluten. es wird nur ein Schott überfluten.

Implementierungen des Schottmusters können viele Formen annehmen, je nachdem, vor welchen Fehlern Sie das System schützen möchten. Ich werde in dieser Antwort nur die Art der Fehler diskutieren, die Hystrix behandelt.

Ich denke, das Schottmuster wurde durch das Buch Release It! von Michael T. Nygard.

Was Hystrix löst

Die Schottimplementierung in Hystrix begrenzt die Anzahl gleichzeitiger Aufrufe einer Komponente . Auf diese Weise ist die Anzahl der Ressourcen (normalerweise Threads), die auf eine Antwort von der Komponente warten, begrenzt.

Angenommen , Sie haben eine Anfrage basierte Multi - Threaded - Anwendung (zum Beispiel eine typische Web - Anwendung) , die verwendet drei verschiedene Komponenten, A , B , und C . Wenn Anfragen an Komponente C zu hängen beginnt, schließlich alle Anforderung bearbeitet Threads für eine Antwort auf der Warteliste von hängen wird C . Dies würde dazu führen, dass die Anwendung nicht mehr reagiert. Wenn Anfragen an C langsam bearbeitet werden, haben wir ein ähnliches Problem, wenn die Last hoch genug ist.

Die Implementierung des Schottmusters durch Hystrix begrenzt die Anzahl gleichzeitiger Aufrufe einer Komponente und hätte in diesem Fall die Anwendung gespeichert. Angenommen , wir 30 Anforderungshandhabungs Threads und es gibt eine Grenze von 10 gleichzeitigen Anrufen C . Dann können höchstens 10 Anforderungsbearbeitungsthreads hängen bleiben, wenn C aufgerufen wird , die anderen 20 Threads können weiterhin Anforderungen verarbeiten und die Komponenten A und B verwenden .

Hystrix 'Ansätze

Hystrix 'hat zwei verschiedene Ansätze für die Schottwand: Thread-Isolation und Semaphor-Isolation.

Fadenisolation

Der Standardansatz besteht darin, alle Anforderungen an Komponente C an einen separaten Thread-Pool mit einer festen Anzahl von Threads und keiner (oder einer kleinen) Anforderungswarteschlange zu übergeben.

Semaphor-Isolierung

Der andere Ansatz besteht darin, dass alle Anrufer vor Anfragen an C eine Genehmigung (mit einer Zeitüberschreitung von 0) erhalten . Wenn eine Erlaubnis nicht vom Semaphor erhalten werden kann, werden Anrufe an C nicht weitergeleitet.

Unterschiede

Der Vorteil des Thread-Pool-Ansatzes besteht darin, dass Anforderungen, die an C übergeben werden, eine Zeitüberschreitung aufweisen können, was bei Verwendung von Semaphoren nicht möglich ist.

K Erlandsson
quelle
10
Zusätzlich gibt es im ursprünglichen Hystrix-Wiki jetzt eine detaillierte Beschreibung beider Ansätze: github.com/Netflix/Hystrix/wiki/How-it-Works
Dmitry
1
Was ist der Unterschied zwischen Leistungsschalter und Schott?
Voipp
4
@voipp Leistungsschalter sind eine ganz andere Sache. Sie erkennen, wenn sich ein Dienst in einem fehlerhaften Zustand befindet, und versetzen Anrufer in einen "schnell fehlgeschlagenen" Zustand, in dem sie den fehlerhaften Dienst nicht aufrufen, sondern stattdessen einen Fehlercode zurückgeben, bis der Dienst wieder in Ordnung ist. Dies vermeidet eine Überlastung des ungesunden Dienstes, damit dieser wiederhergestellt werden kann, und verhindert Kaskadenfehler, da Anrufer nicht verlangsamt werden.
K Erlandsson
1

Hier ist ein gutes Beispiel mit einer Laufzeiterklärung für das Schott in Resilience4j, die von Netflix Hystrix inspiriert ist.

Die folgenden Beispielkonfigurationen bieten möglicherweise Klarheit bei der Verwendung.

Beispielkonfigurationen: Erlauben Sie maximal 5 gleichzeitige Anrufe gleichzeitig. Lassen Sie andere Anrufe warten, bis einer der 5 gleichzeitigen In-Process-Vorgänge beendet ist oder bis maximal 2 Sekunden.

Die Idee ist, kein System mit mehr Last zu belasten, als sie verbrauchen können. Wenn die eingehende Last größer als der Verbrauch ist, warten Sie auf eine angemessene Zeit oder nur auf eine Zeitüberschreitung und wählen Sie einen alternativen Pfad.

Ravi K.
quelle