Antworten:
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.
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 'hat zwei verschiedene Ansätze für die Schottwand: Thread-Isolation und Semaphor-Isolation.
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.
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.
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.
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.