Sicherung (Entwurfsmuster)
Eine Sicherung (englisch circuit breaker) ist ein Verhaltensmuster in der Softwareentwicklung. Es dient dazu, wiederkehrende Verbindungsfehler zu einer Ressource, wie z. B. einer Datenbank oder einem Webservice, zu entdecken und den Zugriff zu der Ressource für eine vorgegebene Zeit zu blockieren.[1] Die Sicherung kann zudem dazu verwendet werden, Funktionalität der Anwendung zeitweise zu deaktivieren.[2] Das Konzept leitet sich von der elektrischen Sicherung ab.
Hintergrund und Funktionsweise
Angenommen, eine Datenbank ist aufgrund von zu vielen Anfragen überlastet, und es kommt zu Timeouts. Dies führt dazu, dass Benutzer – aus psychologischen Gründen – die zuletzt gesetzte Aktion erneut versuchen. Da die Anwendung ohne eine Sicherung für jede Anfrage auf die Datenbank bis zu einem Timeout in einem eigenen Task wartet, kommt es zu einer Erschöpfung des Thread-Pools, und die Anwendung fällt ebenfalls aus.
Um dies zu verhindern, wird in die Anwendung eine Sicherung eingebaut. Diese erkennt, wenn es zu einer großen Anzahl von Verbindungsfehlern kommt und unterbindet den Zugriff auf die Datenbank. Anstatt auf die Datenbank bis zu einem Timeout warten zu müssen, kann die Anwendung gleich einen Fehler zurückliefern bzw. Teile der Anwendung deaktivieren und verbraucht dadurch keine zusätzlichen Threads des Pools. Die Anwendung kann dadurch auch ohne Datenbank, mit eingeschränkter Funktionalität, weiterlaufen. Zudem wird es der Datenbank ermöglicht, sich zu „erholen“.
Nach einer vorgegebenen Zeit wird die Sicherung wieder geschlossen und die Verbindung zur Datenbank erneut versucht. Scheitert dieser Versuch, wird die Sicherung sofort wieder geöffnet. Andernfalls wird die Funktionalität der Anwendung wiederhergestellt.
Da das Auslösen einer Sicherung ein kritisches Ereignis darstellt, sollte dieses sowohl in einer Logdatei, dem Monitoring der Anwendung, als auch in einer OpsDB ersichtlich sein.[2] Für jede Ressource wird eine eigene Sicherung vorgesehen, sodass der Zugriff auf andere Ressourcen weiterhin möglich ist, auch wenn der Zugriff auf eine bestimmte Ressource ausgefallen ist. Zudem wird eine Sicherung meist mit einem Bulkhead kombiniert, damit für jede Ressource ein eigener Thread-Pool zur Verfügung steht.[2]
Implementierungen
.NET
- Polly. The Polly Project, abgerufen am 21. März 2017 (englisch).
- Alexandr Nikitin: CircuitBreaker.NET. GitHub, abgerufen am 21. März 2017 (englisch).
- Hystrix.NET. GitHub, abgerufen am 3. April 2017 (englisch).
Python
- pybreaker. In: python.org. Abgerufen am 21. März 2017 (englisch).
Java
Einzelnachweise
- Martin Fowler: Circuit Breaker. 6. März 2014, abgerufen am 21. März 2017 (englisch).
- Michael T. Nygard: Release It! Design and Deploy Production-Ready Software. O’Reilly, 2007, ISBN 978-0-9787392-1-8 (englisch, 326 S.).