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
Instrukcje do ćwiczenia
- Wewnątrz bloku
trywywołajflaky_callz argumentempayloadi zwróć jej wynik. - Oblicz wykładniczy limit dla bieżącej próby, korzystając z
basei aktualnej wartościattempt. - Zastosuj pełny jitter, losując czas oczekiwania z przedziału od
0docapza 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)