Resilience Patterns: Timeout, Retry, Circuit Breaker
Fehler in verteilten Enterprise-Systemen begrenzen: Bulkhead, Backpressure, Fallback und Idempotenz.
Version 2BetriebCodeDiagramm
In dieser Datei
Teilfehler sind normal
Remote APIs, Broker und Datenbanken können langsam, partiell gestört oder nur für bestimmte Operationen fehlerhaft sein. Resilience verhindert, dass ein Fehler das ganze System mitreißt.
Timeout vor Retry
Jeder Retry braucht ein Zeitbudget und Idempotenz. Ohne Timeout verstärkt Retry die Last. Ohne Idempotenz erzeugt Retry doppelte Geschäftsvorfälle.
Fallback darf nicht lügen
Ein Fallback kann degradieren, aber er darf keinen fachlichen Erfolg vortäuschen. Wenn Zahlung unklar ist, sollte die Bestellung auf WAITING_FOR_PAYMENT stehen, nicht APPROVED.
Entscheidungen
| Entscheidung | Gute Praxis | Prüffrage |
|---|---|---|
| Fachliche Grenze | Zuerst Use Case, Invariante und Verantwortlichkeit klären. | Welche Geschäftsentscheidung wird geschützt? |
| Technische Grenze | Framework-/Library-Code hinter Port, Adapter oder Konfiguration kapseln. | Kann die Domain ohne Framework getestet werden? |
| Betrieb | Timeouts, Logs, Metriken, Traces, Security und Rollback definieren. | Wie erkennt der Betrieb Fehler rechtzeitig? |
Ausführliche Beispiele
Resilience-Konfiguration
resilience4j:
timelimiter:
instances:
payment:
timeout-duration: 2s
retry:
instances:
payment:
max-attempts: 2
wait-duration: 100ms
circuitbreaker:
instances:
payment:
failure-rate-threshold: 50
sliding-window-size: 20
Fallback mit fachlichem Zustand
public PaymentDecision reservePayment(Order order) {
try {
return paymentClient.reserve(order.paymentRequest());
} catch (TimeoutException ex) {
return PaymentDecision.pending("PAYMENT_TIMEOUT");
}
}
Typische Stolperfallen
| Stolperfalle | Warum gefährlich |
|---|---|
| Retry bei Zahlung ohne Idempotency-Key | Doppelte Reservierung möglich. |
| Circuit Breaker ohne Metrik | Niemand versteht, warum Calls blockiert werden. |
| Bulkheads fehlen | Ein langsamer Partner verbraucht alle Threads. |