LoslegenKostenlos starten

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>
Kurs ansehen

Übungsanweisungen

  • Rufe im try-Block flaky_call mit payload auf und gib das Ergebnis zurück.
  • Berechne das exponentielle Limit (cap) für diesen Versuch mithilfe von base und dem aktuellen Zähler attempt.
  • Wende vollen Jitter an, indem du mit random.uniform() eine zufällige Wartezeit zwischen 0 und cap wä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)
Code bearbeiten und ausführen