Inizia subitoInizia gratis

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

Visualizza corso

Istruzioni dell'esercizio

  • All'interno del blocco try, chiama flaky_call con payload e restituiscine il risultato.
  • Calcola il limite esponenziale per questo tentativo usando base e il conteggio corrente di attempt.
  • Applica il full jitter scegliendo un'attesa casuale tra 0 e cap usando random.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)
Modifica ed esegui il codice