Circuit Breaker
Einen gestörten Dienst vorübergehend nicht mehr aufrufen
Die Idee und ihr Nutzen
Das Kundenportal einer Versicherung zeigt zu jedem Schaden Werkstattempfehlungen, die es bei einem Partnerdienst abfragt. Fällt dieser Partnerdienst aus, wartet das Kundenportal bei jeder Schadenseite zehn Sekunden lang auf eine Antwort, die nicht kommt, bis die eingestellte Zeitgrenze abläuft, und wird für alle Kunden langsam. Ein Programmteil im Kundenportal, über den jede Anfrage an den Partnerdienst läuft, zählt deshalb die gescheiterten Anfragen an den Partnerdienst und lässt nach mehreren Fehlern vorerst keine weiteren Anfragen mehr durch. Das Kundenportal erhält sofort die Rückmeldung, dass keine Empfehlungen kommen, und zeigt die übrige Schadenseite mit einem Hinweis. Nach einer Pause probiert der Programmteil mit wenigen Anfragen, ob der Partnerdienst wieder antwortet. Dieser Programmteil heißt Circuit Breaker, auf Deutsch Schutzschalter.
Wie funktioniert es?
Um 10:00 Uhr fragt das Kundenportal wie immer über den Schutzschalter Werkstattempfehlungen beim Partnerdienst an. Der Partnerdienst ist ausgefallen, und jede Anfrage scheitert erst nach zehn Sekunden, wenn ihre Zeitgrenze abläuft. So lang ist die Zeitgrenze, weil der Partnerdienst an Tagen mit vielen Schäden, etwa nach einem Unwetter, für Empfehlungen bis zu acht Sekunden braucht. Nachdem 10 der letzten 20 Anfragen gescheitert sind, öffnet sich der Schutzschalter, denn so ist seine Schwelle eingestellt. Gewöhnlich scheitert höchstens eine von 100 Anfragen an den Partnerdienst; scheitert die Hälfte, ist der Partnerdienst gestört. Solange der Schutzschalter offen ist, lässt er keine Anfrage mehr zum Partnerdienst durch. Eine Kundin ruft nun die Seite zu ihrem Schaden 4711 auf, und das Kundenportal fragt beim Schutzschalter nach Werkstattempfehlungen. Der offene Schutzschalter fragt den Partnerdienst gar nicht erst, sondern antwortet sofort mit „nicht verfügbar“. Das Kundenportal zeigt der Kundin ohne Verzögerung ihre Schadenseite mit Status, Dokumenten und dem Hinweis „Werkstattempfehlungen sind gerade nicht verfügbar“. Nach der eingestellten Pause von 30 Sekunden lässt der Schutzschalter drei Probeanfragen zum Partnerdienst durch. Die Probeanfragen scheitern, und der Schutzschalter bleibt offen. Nach weiteren 30 Sekunden probiert er es erneut. Pause und Zahl der Probeanfragen sind so gewählt, dass Kunden nach dem Ende einer Störung spätestens eine halbe Minute später wieder Empfehlungen sehen und der gestörte Partnerdienst trotzdem nur alle 30 Sekunden drei Anfragen erhält. Um 10:12 Uhr ist der Partnerdienst wieder erreichbar, die Probeanfragen gelingen, und der Schutzschalter schließt sich. Ab jetzt sehen Kunden wieder Werkstattempfehlungen.
Der Schutzschalter ist ein Programmteil im Kundenportal. Das Kundenportal schickt jede Anfrage an den Partnerdienst über den Schutzschalter, und der Schutzschalter zählt mit, welche Anfragen gelingen und welche scheitern oder zu lange dauern. Der Schutzschalter hat drei Zustände: geschlossen, offen und halb offen. Geschlossen bedeutet, dass Anfragen zum Partnerdienst durchgehen. Erreicht der Anteil der Fehler eine festgelegte Schwelle, wechselt der Schutzschalter vom geschlossenen in den offenen Zustand und weist neue Anfragen sofort ab. Im Kundenportal wartet so kein Thread mehr auf den Partnerdienst. Ein Thread arbeitet im Kundenportal jeweils eine Anfrage ab, und das Kundenportal hat nur eine begrenzte Zahl von Threads. Nach einer festgelegten Pause wechselt der Schutzschalter in den halb offenen Zustand und lässt wenige Probeanfragen durch. Gelingen die Probeanfragen, wechselt er zurück in den geschlossenen Zustand, und alle Anfragen gehen wieder durch. Scheitern sie, wechselt er zurück in den offenen Zustand, und die Pause beginnt von vorn.
Der Hinweis, den das Kundenportal statt der Empfehlungen zeigt, heißt Ersatzantwort oder Fallback. Die Störung beim Partnerdienst kann das Kundenportal nicht beheben. Das Entwicklungsteam des Kundenportals legt aber fest, wie lange das Kundenportal wartet, wie oft es fragt und was die Kunden während der Störung sehen. Schwelle und Pause sind Einstellungen für den einzelnen Dienst, keine allgemeingültigen Zahlen. Beide Werte müssen zur üblichen Fehlerquote und zur Zahl der Anfragen an den jeweiligen Dienst passen. Ruft das Kundenportal einen Dienst nur wenige Male am Tag auf, kämen 20 Anfragen für die Schwelle erst nach Stunden zusammen. Die Zeitgrenze begrenzt, wie lange eine einzelne Anfrage wartet. Der Schutzschalter bewertet dagegen viele Anfragen zusammen und stoppt weitere Anfragen ganz. Er ersetzt die Zeitgrenze nicht, sondern ergänzt sie, und er lässt sich auch mit Wiederholungen gescheiterter Anfragen kombinieren. Wiederholt das Kundenportal gescheiterte Anfragen, läuft auch jede Wiederholung über den Schutzschalter, damit der offene Schutzschalter auch die Wiederholungen vom gestörten Partnerdienst fernhält.
Circuit Breaker: Werkstattempfehlung bei Partnerausfall
Circuit Breaker: drei Zustände
Wann ist es sinnvoll und wann nicht?
Ein Circuit Breaker lohnt sich
- Ein Programm ruft über das Netz einen Dienst auf, der langsam werden oder zeitweise ausfallen kann. Ohne Schutzschalter wird das aufrufende Programm mit dem Dienst langsam, so wie das Kundenportal, das bei jeder Schadenseite zehn Sekunden auf den ausgefallenen Partnerdienst wartet.
- Viele gleichartige Anfragen brauchen denselben Dienst. Ohne Schutzschalter belegt beim Kundenportal jede wartende Anfrage zehn Sekunden lang eine Netzwerkverbindung und einen Thread. Rufen in dieser Zeit Hunderte Kunden ihre Schadenseiten auf, sind irgendwann alle Threads belegt. Dann kann das Kundenportal gar keine neuen Seiten mehr ausliefern, auch keine, die den Partnerdienst nicht brauchen.
- Der gestörte Dienst soll während der Störung nicht zusätzlich belastet werden. Ohne Schutzschalter treffen weiter Anfragen auf den gestörten Partnerdienst, und es dauert länger, bis er wieder normal antwortet. Der offene Schutzschalter hält diese Anfragen vom Partnerdienst fern.
- Das Programm kann für diesen Teil seiner Aufgabe eine klare Fehlermeldung oder eine eingeschränkte Ersatzantwort liefern. Beim Kundenportal ist das der Hinweis auf fehlende Empfehlungen. Ohne eine solche Ersatzantwort würde der offene Schutzschalter die Schadenseite nur schneller scheitern lassen.
- Kunden sollen sofort eine eindeutige Rückmeldung erhalten statt einer lange ladenden Seite. Ohne Schutzschalter wartet die Kundin während des Ausfalls bei jedem Aufruf ihrer Seite zu Schaden 4711 zehn Sekunden.
- Das Betriebsteam soll auf einen Blick sehen, welcher abhängige Dienst gerade gestört ist. Der Zustand des Schutzschalters zeigt das. Ohne Schutzschalter sieht das Betriebsteam nur, dass das Kundenportal langsam ist, und muss die Ursache erst suchen.
Ein Circuit Breaker ist nicht das Richtige
- Die Aufrufe laufen innerhalb desselben Programms und nicht über das Netz. Solche Aufrufe können nicht an einem Netzfehler oder einem ausgefallenen Server scheitern, und ein Schutzschalter hätte keine solchen Fehler zu zählen. Dann ruft das Programm den anderen Programmteil direkt auf. Schwelle, Pause und Ersatzantwort eines Schutzschalters muss das Entwicklungsteam des Programms dann weder festlegen noch pflegen.
- Eine einzelne gescheiterte Anfrage ist nicht hinnehmbar, und es gibt keine sinnvolle Ersatzantwort. Ein Beispiel ist ein Zahlungsauftrag an einen Zahlungsdienst. Ein offener Schutzschalter würde den Auftrag sofort abweisen, und der Auftrag ginge verloren. Stattdessen legt das aufrufende Programm den Auftrag in eine Warteschlange, in der der Auftrag wartet, bis der Zahlungsdienst wieder erreichbar ist. So geht während des Ausfalls kein Auftrag verloren.
- Es treten nur vereinzelt kurze Netzfehler auf. Ein Schutzschalter würde seine Schwelle dann nie erreichen und immer geschlossen bleiben. Stattdessen begrenzt das aufrufende Programm jede Anfrage mit einer Zeitgrenze und wiederholt eine gescheiterte Anfrage wenige Male nach wachsenden Pausen, wie es Retry with Backoff beschreibt. Schwelle, Pause und Ersatzantwort eines Schutzschalters muss das Entwicklungsteam dann weder festlegen noch pflegen.
- Ein Dienst ist langsam, liefert aber brauchbare Antworten. Nach einem Unwetter braucht der Partnerdienst zum Beispiel bis zu acht Sekunden, und die Kunden sollen seine Empfehlungen trotzdem sehen. Ein Schutzschalter lässt diese Anfragen durch, weil sie innerhalb der Zeitgrenze gelingen. Jede Anfrage belegt dann bis zu acht Sekunden lang einen Thread, und bei vielen Kunden sind bald alle Threads des Kundenportals belegt. Stattdessen baut das Entwicklungsteam des Kundenportals einen Bulkhead in das Kundenportal ein: Die Anfragen an den Partnerdienst dürfen nur eine festgelegte Zahl von Threads und Verbindungen belegen. Die übrigen Threads bleiben für Seiten frei, die den Partnerdienst nicht brauchen, und die Anfragen an den Partnerdienst werden weiter beantwortet, statt abgewiesen zu werden. Ein Bulkhead lässt sich auch mit einem Schutzschalter kombinieren.
Nachteile und typische Fehler
Ein Schutzschalter braucht eine passend eingestellte Schwelle, eine passende Pause und eine sinnvolle Ersatzantwort für den offenen Zustand. Ist die Schwelle zu niedrig eingestellt, etwa auf 2 von 20 Anfragen, sperrt der Schutzschalter einen Dienst, der nur kurz gestört war, und Kunden sehen unnötig den Hinweis. Ist die Schwelle zu hoch eingestellt, etwa auf 19 von 20 Anfragen, öffnet der Schutzschalter erst, wenn das Kundenportal schon kaum noch freie Threads hat. Läuft das Kundenportal in mehreren Exemplaren desselben Programms auf mehreren Servern, enthält meist jedes Exemplar einen eigenen Schutzschalter, weil der Schutzschalter ein Programmteil des Kundenportals ist. Jeder dieser Schutzschalter zählt nur die Anfragen seines eigenen Exemplars. Die Exemplare können deshalb für kurze Zeit unterschiedlich reagieren: In einem Exemplar ist der Schutzschalter schon offen, in einem anderen noch geschlossen.
Typische Fehler und woran man sie erkennt:
- Falsche Fehler gezählt: Der Partnerdienst weist Anfragen mit ungültigen Eingaben von Kunden ab, etwa mit einer falschen Postleitzahl. Der Schutzschalter zählt diese Abweisungen als Fehler des Partnerdienstes, obwohl der Partnerdienst arbeitet. Sind 10 der letzten 20 Anfragen solche Abweisungen, öffnet sich der Schutzschalter. Danach weist der Schutzschalter auch korrekte Anfragen anderer Kunden ab. Erkennbar ist das an offenen Schutzschaltern ohne Störungsmeldung des Partnerdienstes.
- Zu viele Probeanfragen: Die Zahl der Probeanfragen ist zu hoch eingestellt, zum Beispiel auf 200 statt auf drei. Nach der Pause lässt der Schutzschalter dann 200 Anfragen gleichzeitig zum Partnerdienst durch. Die Anfragen treffen auf einen Partnerdienst, der gerade erst wieder anläuft, und lösen eine neue Störung aus. Erkennbar ist das an einem Schutzschalter, der sich kurz nach dem Schließen wieder öffnet.
- Irreführende Ersatzantwort: Das Kundenportal zeigt statt eines Hinweises eine leere Liste. Kunden schließen daraus, es gebe keine Partnerwerkstatt in ihrer Nähe, und entscheiden auf falscher Grundlage. Erkennbar ist das an leeren Listen von Werkstattempfehlungen zu Zeiten, in denen der Schutzschalter offen ist.
- Keine Überwachung: Ein offener Schutzschalter ist in der Betriebsüberwachung nicht sichtbar. Der Schutzschalter bleibt stundenlang offen, ohne dass das Betriebsteam den Ausfall des Partnerdienstes oder eine falsche Einstellung bemerkt. Erkennbar ist das an Kunden, die fehlende Werkstattempfehlungen melden, bevor das Betriebsteam von der Störung weiß.
Weiterführend
Quellen
- Microsoft: Circuit Breaker Pattern: beschreibt Ablauf, Zustände, Einsatz und Grenzen des Musters.
- Resilience4j: Dokumentation einer Java-Bibliothek, die einen Schutzschalter mit einstellbarer Schwelle, Pause und Zahl der Probeanfragen bereitstellt.
- Polly: Dokumentation einer Bibliothek für die Plattform .NET mit einem entsprechenden Baustein.