Resilient-Architekturen mit Circuit Breaker

Die Aspekte von Resilient-Architekturen sind umfassend. Neben einigen grundlegenden Paradigmen wie zum Beispiel lose Kopplung, Fallback und Redundanz, stellen auch einige Architektur-Muster wichtige Meilensteine auf dem steinigen Weg zu Resilient dar. Eines dieser Muster ist Circuit Breaker. In diesem Beitrag stellen wir das Architektur-Muster Circuit Breaker vor und diskutieren mögliche Einsatzszenarien.

Resilient: eine (ganz) kurze Einführung

Die Systemlandschaften von heute bestehen aus vielen Komponenten, die miteinander kommunizieren. In diesem Zusammenhang ist oft von verteilten Systemen die Rede, die den Anwendern gegenüber jedoch als einheitliches System auftreten. Bei der Kommunikation zwischen Komponenten eines verteilten Systems treten häufig Fehler auf. Kann das System mit unerwarteten Fehlersituationen umgehen und die Anwender merken nicht, dass ein Fehler aufgetreten ist, so handelt es sich um eine Resilient-Architektur. Das englische Wort „resilient“ lässt sich in diesem Kontext am besten mit „robust“ übersetzen. Eine Resilient-Architektur ist also robust gegenüber Fehlern. Weiterführende Informationen zum Thema Resilient-Design gibt es hier.

Circuit Breaker als Sicherung

Bei einem Circuit Breaker handelt es sich um eine Sicherung. Das Konzept leitet sich von der elektrischen Sicherung ab: Bei zu hoher Stromstärke unterbricht die Sicherung den Stromfluss, um die Leitung vor Überlast zu schützen.

Im Kontext von verteilten Systemen sprechen wir jedoch nicht von Stromflüssen, sondern von dedizierten Kommunikationsflüssen zwischen unterschiedlichen Bestandteilen einer Software. Die Komponenten eines verteilten Systems kommunizieren miteinander und tauschen Daten aus. Treten bei der Kommunikation Fehlerzustände auf, so kann dadurch die Funktionalität des gesamten Systems beeinträchtigt werden.

Stellen wir uns folgendes Szenario vor: In einem verteilten System nutzt Client die Funktion Service bei Server. Server steht unter Last und beantwortet die Anfragen immer langsamer. Client ignoriert dies und setzt die Nutzung von Service in gleichem Maße fort, bis Server komplett ausfällt. Handelt es sich bei Service um einen kritischen Geschäftsprozess, ist dieser nicht mehr nutzbar. Das bedeutet, dass Client beim Aufruf keine Antwort mehr erhält und dadurch seine Fachlichkeit nicht mehr abbilden kann.

Hohe Last- Server fällt aus (keine Sicherung)

Ein Circuit Breaker kann helfen, das oben beschriebene Szenario zu vermeiden. Der Circuit Breaker wird zwischen Client und Server geschaltet und leitet die Anfragen von Client an Server einfach weiter. Die wichtigste Aufgabe des Circuit Breaker besteht darin, die Kommunikation anhand bestimmter Metriken (z.B. Anzahl der Timeouts) zu überwachen. Wird ein Schwellenwert bei der Kommunikation überschritten (z.B. anzahlTimeOuts > festgelegterWert), leitet der Circuit Breaker die Anfragen von Client nicht mehr an Server weiter. Die Sicherung löst somit aus und Server wird vor zu hoher Belastung geschützt.

Hohe Last – Server wird geschütz (Sicherung ausgelöst)

Sicherung ausgelöst: was nun?

Nachdem die Sicherung ausgelöst wurde, leitet der Circuit Breaker die Anfragen von Client nicht mehr an Server weiter, sondern beantwortet diese selbst.

Szenario 1: Circuit Breaker beantwortet Client-Anfragen (Sicherung ausgelöst)

Der Circuit Breaker könnte hier zum Beispiel Standard-Werte, Daten aus einer älteren Sicherungskopie oder auch eine Fehlermeldung ausliefern. Im Wesentlichen geht es darum, die Fachlichkeit zumindest zum Teil aufrechtzuerhalten und Ressourcen zu sparen. Es ist zwar nicht optimal, dass Client keine aktuellen Daten bekommt, diese Vorgehensweise ist jedoch auf jeden Fall besser als wenn gar keine Daten übermittelt werden. Ebenso ist es nicht optimal, dass Client eine Fehlermeldung bekommt. Da Client jedoch nicht auf eine Antwort warten muss, werden wertvolle Ressourcen gespart.

Es sind weitere Szenarien denkbar, bei welchen der Circuit Breaker die Anfragen an andere Server weiterleitet, die sich bei einem Verzeichnisdienst registriert haben und dem Circiut Breaker bekannt sind.

Szenario 2: Circuit Breaker leitet die Client-Anfragen weiter (Sicherung ausgelöst)

Im Gegensatz zu einer elektrischen Sicherung soll der Circiut Breaker die unterbrochene Kommunikation zwischen Client und Server selbständig wieder aktivieren können. Dafür leitet der Circuit Breaker einige Anfragen von Client an Server weiter und überwacht anhand der ausgewählten Metrik den Schwellenwert: Wird dieser Wert unterschritten (z.B. anzahlTimeOuts < festgelegterWert), leitet der Circuit Breaker auch die nachfolgenden Anfragen an Server weiter. Die Kommunikation ist somit wiederhergestellt.

Kommunikation zwischen Client und Server wiederhergestellt

Eine Referenzimplementierung der Logik für die Aktivierung der Sicherung sowie Wiederaufnahme der Kommunikation findet sich in einem Blog-Artikel von Martin Fowler.

Zusammenfassung

Im Kontext einer Resilient-Architektur spielt das Muster Circuit Breaker eine wichtige Rolle. Dieses Muster hilft dabei, im Fehlerfall die Fachlichkeit zum Teil aufrechtzuerhalten und/ oder Ressourcen zu sparen.

 

Autor: Nicolai Zaidman

Jetzt lesen

Blog - Technologie & Innovation

Serverless Cloud Architecture – Sichere Datenverteilung mit AWS S3, CloudFront und Lambda@Edge

Jetzt lesen

Weitere News

WIR SIND FÜR SIE DA!

Mit Q_PERIOR steht Ihnen ein starker Partner zur Seite.
Wir freuen uns auf Ihre Herausforderung!

18. Mai 2018|