Exponentielles Backoff mit Jitter implementieren
Du integrierst eine wackelige Third-Party-Payment-API, die gelegentlich vorübergehende Fehler zurückgibt. Damit du den Dienst nicht zusätzlich belastest, wenn er ohnehin schon strauchelt, implementierst du eine Retry-Strategie mit exponentiellem Backoff und vollem Jitter. Dabei erhöhst du die Wartezeit zwischen den Versuchen und fügst Zufall hinzu, damit nicht eine ganze Herde von Clients im selben Moment erneut versucht.
Es steht eine Funktion flaky_call(payload) zur Verfügung: Sie schlägt bei den ersten 3 Aufrufen mit TransientError fehl und klappt beim 4. Mal. time, random und TransientError sind bereits geladen.
Diese Übung ist Teil des Kurses
<Kurs>Anwendungen auf AWS entwickeln</Kurs>Übungsanweisungen
- Rufe im
try-Blockflaky_callmitpayloadauf und gib das Ergebnis zurück. - Berechne das exponentielle Limit (cap) für diesen Versuch mithilfe von
baseund dem aktuellen Zählerattempt. - Wende vollen Jitter an, indem du mit
random.uniform()eine zufällige Wartezeit zwischen0undcapwählst.
Interaktive praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
def retry_with_backoff(payload, max_attempts=5, base=0.2):
last_error = None
for attempt in range(max_attempts):
try:
# Try the call
return ____(payload)
except TransientError as err:
last_error = err
# Cap grows exponentially with each attempt
cap = ____ * (2 ** attempt)
# Pick a random wait between 0 and cap (full jitter)
wait = random.____(0, cap)
time.sleep(wait)
# All attempts failed; surface the last error
raise last_error
result = retry_with_backoff({"order_id": 42})
print(result)