Zacznij terazZacznij za darmo

Implementacja wykładniczego wycofania z jitterem

Integrujesz się z niestabilnym zewnętrznym API płatności, które od czasu do czasu zwraca błędy przejściowe. Żeby nie zalewać serwisu żądaniami, gdy i tak ledwo daje radę, zaimplementujesz strategię ponawiania opartą na wykładniczym wycofaniu z pełnym jitterem — zwiększasz odstęp między próbami, dodając losowość, dzięki której gromada klientów nie będzie wznawiać prób w tej samej chwili.

Dostępna jest funkcja flaky_call(payload): przez pierwsze 3 wywołania zgłasza wyjątek TransientError, a przy 4. kończy się sukcesem. Moduły time, random oraz klasa TransientError są już załadowane.

To ćwiczenie jest częścią kursu

Tworzenie aplikacji na AWS

Zobacz kurs

Instrukcje do ćwiczenia

  • Wewnątrz bloku try wywołaj flaky_call z argumentem payload i zwróć jej wynik.
  • Oblicz wykładniczy limit dla bieżącej próby, korzystając z base i aktualnej wartości attempt.
  • Zastosuj pełny jitter, losując czas oczekiwania z przedziału od 0 do cap za pomocą random.uniform().

Interaktywne ćwiczenie praktyczne

Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.

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)
Edytuj i uruchom kod