Implementare l'exponential backoff con jitter
Ti stai integrando con una API di pagamenti di terze parti instabile che a volte restituisce errori transitori. Per evitare di sovraccaricare il servizio quando è già in difficoltà, implementerai una strategia di retry che usa exponential backoff con full jitter, aumentando l'attesa tra i tentativi e aggiungendo casualità così che un'orda di client non ritenti tutti nello stesso istante.
È disponibile una funzione flaky_call(payload): fallisce con TransientError nelle prime 3 invocazioni, poi riesce alla 4ª. time, random e TransientError sono già caricati.
Questo esercizio fa parte del corso
Sviluppare applicazioni su AWS
Istruzioni dell'esercizio
- All'interno del blocco
try, chiamaflaky_callconpayloade restituiscine il risultato. - Calcola il limite esponenziale per questo tentativo usando
basee il conteggio corrente diattempt. - Applica il full jitter scegliendo un'attesa casuale tra
0ecapusandorandom.uniform().
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
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)