Retry con exponential backoff
Utilizzi tenacity per riprovare le operazioni temporaneamente non riuscite con ritardi esponenziali e jitter.
Retry con exponential backoff è una lezione AI Agents gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Agents, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Agents include 4 lezioni in totale.
Perché utilizzare i tentativi?
Le chiamate esterne (LLM, API di ricerca, database vettoriali) possono fallire temporaneamente. Un semplice tentativo consente di recuperare dalla maggior parte dei problemi intermittenti senza disturbare l'utente.
Che cosa NON fare
Non riprovi immediatamente in un ciclo stretto: sovraccaricherebbe il servizio e il rate limiter potrebbe bloccare l'accesso:
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
passBackoff esponenziale
Attenda più a lungo dopo ogni errore. L'esponente 2 è la convenzione:
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 secondsAggiungere jitter
Senza jitter, i tentativi di molti client si sincronizzano, creando traffico a effetto valanga. Aggiunga uno scostamento casuale:
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)Utilizzare Tenacity
La libreria tenacity implementa tutto questo al posto Suo:
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()Riprovare solo in caso di errori temporanei
Non riprovi mai in caso di:
- errori 4xx (richiesta non valida: riprovare non sarà utile)
- errori di autenticazione
- errori di convalida
Riprovi in caso di:
- timeout
- errori del server 5xx
- limiti di frequenza (attendendo più a lungo)
Tentativi consapevoli dei limiti di frequenza
Rispetti l'header Retry-After:
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continueLimitare la durata totale dei tentativi
Limiti la durata complessiva dei tentativi: in genere 30-60 secondi per una chiamata rivolta all'utente:
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...Header di idempotenza
Per le API non idempotenti (Stripe e simili), includa una chiave di idempotenza in ogni tentativo, in modo da accorpare i duplicati:
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}Riprovare anche la chiamata LLM
Gli SDK di OpenAI e Anthropic riprovano automaticamente 1-2 volte. Può configurare:
client = OpenAI(max_retries=5, timeout=30.0)Tentativi asincroni
Per il codice asincrono:
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()Registrare i tentativi
Ogni tentativo dovrebbe registrare: numero del tentativo, durata dell'attesa e motivo dell'errore. In caso contrario, eseguire il debug di "perché è così lento?" è impossibile.
Tentativi e timeout
Imposti un timeout breve per ogni tentativo (ad esempio 10 s) e un limite totale tramite stop_after_delay (ad esempio 60 s). Senza entrambi, una connessione bloccata può rimanere in attesa per sempre.
Perché aggiungere jitter?
Perché aggiungere un jitter casuale ai ritardi tra i tentativi?
Riepilogo
Backoff esponenziale + jitter + durata totale limitata + tentativi solo in caso di errori temporanei. Utilizzi tenacity per evitare il codice ripetitivo.
Domande Frequenti
La lezione «Retry con exponential backoff» è gratuita?
Sì — il testo completo di «Retry con exponential backoff» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Agents, passa a CoddyKit PRO. Il corso AI Agents include 4 lezioni in totale.
Cosa imparerò in «Retry con exponential backoff»?
Utilizzi tenacity per riprovare le operazioni temporaneamente non riuscite con ritardi esponenziali e jitter. Eserciti AI Agents con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare AI Agents?
Non è richiesta alcuna esperienza precedente. AI Agents su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Retry con exponential backoff»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione AI Agents?
Sì. Ogni lezione AI Agents include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Strumenti idempotenti ed effetti collaterali
- Retry con exponential backoff
- Timeout e circuit breaker
- Convalidare gli output degli strumenti (Pydantic)