Ein erfahrener Back-End-Entwickler, der sich auf .NET, MS SQL und die Implementierung von Microsoft-basierten Lösungen spezialisiert hat.Er entwickelt leidenschaftlich Cloud-basierte Lösungen und entdeckt interessante Designmuster. Privat genießt er das Wandern und Motorradfahren.
Inhaltsverzeichnis
Das Problem
Dienste arbeiten bei der Bearbeitung von Anforderungen häufig zusammen. Dies ist insbesondere bei Mikrodiensten der Fall, welche logischerweise verteilt sind. Wenn ein Dienst synchron einen anderen aufruft (einen externen Dienst wie Zahlungs-APIs, Lagerautomatisierung usw.), besteht immer die Möglichkeit, dass der andere Dienst nicht verfügbar oder stark ausgelastet ist. Es ist üblich Wiederholungsmuster für erfolglose Versuche zu verwenden, es kann jedoch für das System gefährlich sein. Es wird versucht den Dienst eines Drittanbieters immer wieder mithilfe von z.B. Threads aufzurufen, während auf die Antwort gewartet wird. Dies verlangsamt Ihr System und kann zu einer Erschöpfung der Ressourcen führen, sodass der Dienst andere Anforderungen nicht mehr verarbeiten kann. Der Ausfall eines Dienstes kann sich möglicherweise auf andere Dienste in der gesamten Anwendung ausbreiten.
Die Lösung
Das Circuit Breaker Pattern verhindert, dass eine Anwendung Vorgänge ausführt, bei denen es wahrscheinlich ist, dass sie fehlschlagen. So dass Fehler nicht auf andere Dienste übertragen werden und ist hilfreich beim Erstellen ausfallsicherer Systeme. Die Sicherung fungiert als Proxy und überwacht die Anzahl der kürzlich aufgetretenen Fehler. Anschließend entscheidet es anhand dieser Informationen, ob der Vorgang fortgesetzt oder eine Ausnahme sofort zurückgegeben werden soll. Kurz gesagt, funktioniert es wie ein Stromkreis in einem Haus: Wenn es geschlossen ist funktioniert das Gerät, wenn es defekt ist (z. B. durch einen Schalter), funktioniert das Gerät nicht mehr.
Circuit Breaker Pattern – Die Status
Die Sicherung kann implementiert werden als State Machine mit den folgenden Zuständen:
- Closed – Der initiale Zustand. Die Anforderung, den angegebenen Pfad zu durchlaufen, funktioniert und verursacht keine Systemfehler. Wenn die Anzahl der letzten Fehler einen bestimmten Schwellenwert überschreitet, führt dies zu einer Unterbrechung des Stromkreises und der geschlossene Zustand wechselt in den offenen. Zu diesem Zeitpunkt startet der Proxy einen Timeout-Timer. Wenn dieser abläuft, wird der Proxy in den Status „Half-Open“ versetzt.
- Open - Wenn eine Anwendung in diesen Status wechselt, schlagen die eingehenden Anforderungen für ein bestimmtes Zeitlimit sofort fehl.
- Half-Open – Die Sicherung übergibt eine bestimmte Anzahl von Anforderungen, um den Status der Ressource zu testen. Der halboffene Zustand bestimmt, ob der Stromkreis in den geschlossenen oder den offenen Zustand zurückkehrt.
Die häufigsten Schwellenwerte bei der Implementierung des Leistungsschaltermusters sind Verbindungszeitüberschreitungen, Fehler, falsche Statuscodes und unerwartete Antworttypen.
Implementierung
Es ist ziemlich kompliziert, einen Circuit Breaker von Grund auf neu zu implementieren und es würde eine Weile dauern, bis er richtig ausgeführt wird. Es gibt viele Informationen, wo Entwickler Richtlinien verwenden können, z. B. Polly für .NET oder Resilience4j für Java. Hier ist ein einfaches Beispiel für die Verwendung eines Circuit Breaker Pattern mit der Polly-Bibliothek. Es definiert einen Stromkreis, der nach 3 Ausnahmen öffnet und nach 1 Minute wieder schließt.
Die Applikation führt die Methode viermal aus, beim vierten Mal erhalten Sie eine open circuit Ausnahme.
Einfach eine Minute vor der vierten Ausführung warten:
Wie erwartet wird wieder geschlossen und die Methode zum vierten Mal ausgeführt:
Zusammenfassung
Das Circuit Breaker Pattern wird oft zusammen mit dem Wiederholungsmuster verwendet. Beide ordnungsgemäß implementierten und konfigurierten Muster sind leistungsstarke Tools für Richtlinien zur Ausfallsicherheit von Anwendungen. Das Circuit Breaker Pattern hilft dem System, das Senden unnötiger Lasten an einen ausgefallenen Dienst zu verhindern. Die Implementierung mit den vorhandenen Informationen ist normalerweise einfach. Es kann jedoch schwierig werden, die geeigneten Schwellenwerte auszuwählen, ohne Fehlalarme zu erzeugen oder eine übermäßige Latenz zu verursachen. Es gibt Möglichkeiten dies zu erreichen, beispielsweise durch Implementierung eines detaillierten Protokollierungsmechanismus, bei dem die Sicherung verwendet wird. Durch Analyse der Informationen in den Protokollen können die Schwellenwerte auf das richtige Niveau eingestellt werden. Manchmal erfordert dieser Vorgang eine lange Beobachtung und mehrere Anpassungen. Sobald Sie jedoch die richtigen Schwellenwerte gefunden haben, können Sie vom implementierten Muster profitieren und Ihre Anwendung vor einer Überlastung schützen.
Ein erfahrener Back-End-Entwickler, der sich auf .NET, MS SQL und die Implementierung von Microsoft-basierten Lösungen spezialisiert hat.Er entwickelt leidenschaftlich Cloud-basierte Lösungen und entdeckt interessante Designmuster. Privat genießt er das Wandern und Motorradfahren.