Zuverlässigkeit
Zuverlässigkeit ist die Disziplin, betriebsfähig zu bleiben, wenn die Umgebung um dich herum versagt – denn das wird sie. Gestalte zuerst für partielle Ausfälle; die glücklichen Pfade regeln sich von selbst.
Regeln
- Timeouts bei jedem ausgehenden Aufruf. Keine Ausnahmen. Ein fehlendes Timeout ist ein Thread-Pool-Erschöpfungsvorfall, der nur darauf wartet, zu passieren.
- Wiederhole nur idempotente Operationen. Mit exponentiellem Backoff und Jitter. Das Wiederholen eines nicht-idempotenten POST erzeugt Duplikate, belastet Kreditkarten doppelt, sendet zwei E-Mails.
- Idempotenzschlüssel bei mutierenden öffentlichen APIs. Ermöglichen Clients sichere Wiederholungen bei Netzwerkstörungen, ohne dass du raten musst.
- Unterbreche externe Abhängigkeiten mit Circuit Breaker. Wenn ein nachgelagerter Dienst krank ist, schützt schnelles Fehlschlagen sowohl dich als auch ihn. Blinde Wiederholungen verwandeln eine Störung in zwei.
- Kapsle kritische Pfade (Bulkhead). Isoliere Thread-Pools / Verbindungspools pro nachgelagertem Dienst, damit ein langsamer nicht den gesamten Service lahmlegen kann.
- Sanfte Degradation ist besser als harter Fehler. Liefere einen veralteten Cache, eine teilweise Antwort oder eine reduzierte Funktionsvielfalt statt eines 500.
- Keine Single Points of Failure. Multi-AZ für jeden zustandsbehafteten Komponenten, mehrere Replikate für jeden zustandslosen, LB-Health-Checks, die tatsächlich Krankheit erkennen.
- Herunterfahren muss sanft erfolgen. Entgegennahme laufender Anfragen beenden, Pools schließen, Puffer leeren. SIGTERM → keine neuen Anfragen annehmen → laufende beenden oder abbrechen → beenden.
- Stelle sicher, dass ein Neustart jederzeit sicher ist. Jeder einzelne Pod sollte jederzeit getötet werden können, ohne dass der Benutzer etwas merkt. Wenn nicht, ist das der Fehler, der behoben werden muss.
- Backups sind ungetestet, bis du aus ihnen wiederherstellst. Führe eine echte Wiederherstellungsübung nach Plan durch.
Rote Flaggen
restTemplate.exchange(...)ohne konfiguriertes Timeout.- Eine Wiederholungsschleife ohne Begrenzung und ohne Backoff.
- „Es funktioniert, wenn du neu bereitstellst.“ (Versteckter Zustand im Speicher.)
- Ausfallfreie Bereitstellungen, die nicht wirklich ausfallfrei sind, weil Anfragen bei SIGTERN fallen gelassen werden.
- Disaster-Recovery-Playbook, das noch nie ausgeführt wurde.