Im Allgemeinen besteht das Ziel des Schottmusters darin, Fehler in einem Teil eines Systems zu vermeiden, um das gesamte System auszuschalten. Der Begriff kommt von Schiffen, bei denen ein Schiff in separate wasserdichte Abteile unterteilt ist, um zu vermeiden, dass ein einzelner Rumpfbruch das gesamte Schiff überflutet.
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 besprechen, die Hystrix behandelt.
Ich denke, das Schottwandmuster wurde durch das Buch Release It! von Michael T. Nygard.
Was Hystrix löst
Die Bulkhead-Implementierung in Hystrix begrenzt die Anzahl gleichzeitiger Aufrufe einer Komponente. Auf diese Weise ist die Anzahl der Ressourcen (normalerweise Threads), die auf eine Antwort der Komponente warten, begrenzt.Angenommen, Sie haben eine anforderungsbasierte Multithread-Anwendung (z. B. eine typische Webanwendung), die drei verschiedene Komponenten verwendet: A, B und C. Wenn Anforderungen an die Komponente C hängen bleiben, warten schließlich alle Threads zur Anforderungsbehandlung auf eine Antwort von C. Dies würde dazu führen, dass die Anwendung nicht mehr reagiert. Wenn Anfragen an C langsam behandelt werden, haben wir ein ähnliches Problem, wenn die Last hoch genug ist.
Die Implementierung des Bulkhead-Musters durch Hystrix begrenzt die Anzahl gleichzeitiger Aufrufe einer Komponente und hätte die Anwendung in diesem Fall gespeichert. Angenommen, wir haben 30 Threads zur Anforderungsbehandlung und es gibt ein Limit von 10 gleichzeitigen Aufrufen von C. Dann können höchstens 10 Anforderungshandhabungsthreads hängen bleiben, wenn C aufgerufen wird, die anderen 20 Threads können weiterhin Anforderungen verarbeiten und die Komponenten A und B verwenden.
Hystrix‘ approaches
Hystrix‘ hat zwei verschiedene Ansätze für das Bulkhead, Thread Isolation und semaphore Isolation.
Thread-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.
Semaphorisolierung
Der andere Ansatz besteht darin, dass alle Anrufer vor Anfragen an C eine Genehmigung (mit 0 Timeout) erhalten. Wenn eine Berechtigung nicht vom Semaphor abgerufen werden kann, werden Aufrufe an C nicht weitergeleitet.
Unterschiede
Der Vorteil des Thread-Pool-Ansatzes besteht darin, dass Anforderungen, die an C übergeben werden, ein Zeitlimit haben können, was bei Verwendung von Semaphoren nicht möglich ist.