Unità 8 / 11

Limiti di velocità e gestione resiliente degli errori

Guadagni:

  • Può interpretare i limiti di velocità (RPM/ITPM/OTPM) e gli errori 429
  • Implementa il backoff esponenziale e riprova con retry-after
  • Classifica e gestisce correttamente i codici di errore HTTP comuni (400/401/429/500/529)

In un ambiente di produzione, nessuna API risponde sempre perfettamente. A volte invii richieste troppo velocemente e raggiungi il limite; a volte il server è temporaneamente occupato; A volte la tua richiesta è sbagliata fin dall'inizio. Ciò che distingue una solida integrazione da un tentativo amatoriale è che gestisce queste situazioni in modo predittivo e automatico. In questa unità imparerai i limiti di velocità (RPM/ITPM/OTPM), l'errore 429, i nuovi tentativi con backoff esponenziale e la corretta classificazione dei comuni codici di errore HTTP. L'obiettivo: costruire un flusso così robusto che un utente non se ne accorgerà mai.

Cosa sono i limiti di velocità?

Il fornitore limita la quantità di lavoro che un interruttore può svolgere in un determinato periodo di tempo. Questa protezione; Protegge sia l'infrastruttura che te da improvvise esplosioni di costi. Esistono tre tipi comuni di limiti:

  • RPM (Richieste al minuto): numero di richieste al minuto.
  • ITPM (Token di input al minuto): token di input che può essere elaborato al minuto.
  • OTPM (Output Tokens Per Minute): token di output che può essere prodotto al minuto.

Se superi uno qualsiasi di questi limiti, il provider rifiuta la richiesta e restituisce un codice di errore 429. I limiti generalmente variano a seconda del livello del tuo account (livello) e possono essere aumentati nel tempo.

Suggerimento: puoi controllare quando ti stai avvicinando al limite dalle intestazioni di risposta. La maggior parte dei provider segnala la quota rimanente con intestazioni come x-ratelimit-remaining-*. Monitorare questi valori e limitare il traffico davanti è il modo più maturo per prevenire il problema senza ottenere un 429.

429 e ritracciamento esponenziale

429 (limite di velocità) è un errore temporaneo e riprovabile. La risposta corretta è attendere un po' la richiesta e riprovare. Ma un'attesa costante non basta; Se tutti riprovano allo stesso tempo, il limite verrà nuovamente raggiunto. La soluzione è il backoff esponenziale: aumentare esponenzialmente il tempo di attesa per ogni tentativo fallito.

# Prova logica di backoff esponenziale 1 → 429 → aspetta 1 secondo prova 2 → 429 → aspetta 2 secondi prova 3 → 429 → aspetta 4 secondi prova 4 → 429 → aspetta 8 secondi (+ piccolo "jitter" casuale)... rinuncia e segnala dopo al massimo N prove

Aggiungendo un po' di casualità (jitter) a questo si evita il conflitto delle richieste quando si tenta di riprovare contemporaneamente. Inoltre, la risposta 429 spesso porta un'intestazione "retry-after": "riprova tra questo numero di secondi". Rispettare questo titolo è più accurato che aspettare ciecamente.

Attenzione: quando ricevi un 429, "forzarlo inviando più richieste" peggiorerà la situazione; Il limite continua a essere riempito e nessuna richiesta viene portata a termine. La risposta corretta è la ritirata, non l’accelerazione. Buone notizie: la maggior parte degli SDK ufficiali riprova automaticamente gli errori 429 e del server con un backoff: utilizza questo comportamento dell'SDK prima di installarlo manualmente.

Classificazione dei codici di errore HTTP

Non tutti gli errori sono uguali. Distinzione critica: è possibile riprovare o si tratta di un problema di richiesta/identità?

Codice

Significato

Si può riprovare?

risposta corretta

400

Richiesta non valida (errore formato/parametro)

no

Correggere la richiesta; non inviare di nuovo lo stesso

401

Errore di autenticazione (chiave non valida/mancante)

no

Correggi chiave/titolo

403

Nessuna autorizzazione (nessun accesso al modello/funzionalità)

no

Controlla autorizzazioni/ambito

404

Non trovato (ID modello/endpoint errato)

no

ID/indirizzo modello corretto

429

Limite di velocità superato

Ritirata + riprova dopo

500

Errore del server

Riprovare con la ritirata

529

Server sovraccarico

Riprovare con la ritirata

Regola d'oro: 429, 500 e 529 sono temporanei; Si riprova con il ritiro. 400, 401, 403, 404 sono problemi di richiesta/identità; Riprovare non risolverà il problema e sarà uno spreco di sforzi. Il codice deve distinguere tra questi due gruppi.

Passo dopo passo: chiamata duratura

  1. Invia la richiesta. In caso di successo, continua.
  2. Classificare il codice di errore. Si può riprovare?
  3. Se provabile: segui retry-after, applica backoff esponenziale + jitter, prova un numero limitato di volte (ad esempio 5 max).
  4. Se non si tenta: correggere (formato/chiave) e interrompere; Non ripetere la stessa richiesta errata nel ciclo.
  5. Considera l'idea di arrenderti. Se ancora non si riesce dopo n tentativi, mostra un messaggio educato all'utente e registra l'evento (unità di monitoraggio 11).

# Chiamata robusta pseudo-codificata = 0repeat: risposta = request_at() se risposta.success: restituisce risposta se risposta.code in [429, 500, 529] e prova < 5: aspetta = riprova_dopo ?? (2^prova sec + jitter) sleep(aspetta); prova += 1; git di nuovo se Response.code in [400, 401, 403, 404]: save_error(response); return "la richiesta deve essere corretta" return "errore permanente, riprova più tardi"

# Feedback cortese all'utente (una volta esauriti i tentativi) "Sono occupato in questo momento, non sono riuscito a elaborare la tua richiesta. Riprova presto, oppure ho salvato la tua richiesta, ti ricontatterò quando sarà pronta."

Prompt debole/Prompt forte (qui: progettazione del messaggio di errore)

# DEBOLE (mostra l'errore non elaborato all'utente)"Errore 429: rate_limit_error"

# FORTE (facile da usare, rassicurante, suggerimento di azione) "Si è verificata una congestione temporanea nel sistema. Abbiamo ricevuto la tua richiesta in modo sicuro e viene riprovata automaticamente. Se un risultato non viene visualizzato entro pochi secondi, puoi aggiornare la pagina."

Rivelare l’errore tecnico grezzo all’utente finale mina la fiducia e può rappresentare una vulnerabilità della sicurezza. Classificare gli errori internamente e fornire all'utente un messaggio calmo e orientato all'azione; basta scrivere i dettagli tecnici per la cronaca.

Tre mini custodie

Caso 1 — La barca si è schiantata nell'esplosione del traffico. Un bot del servizio clienti ha ricevuto 429 picchi di traffico nel giorno della campagna; Non c'era nessun tentativo nel codice, ogni errore veniva riflesso direttamente all'utente come un "errore". Hanno aggiunto ritracciamento esponenziale + retry-after; con lo stesso traffico, le richieste sono passate con un ritardo di diversi secondi, l'utente non ha riscontrato alcun errore.

Caso 2: tentativo di 400 nel loop. Un'integrazione riceveva un 404 a causa di un ID modello non valido, ma trattava tutti gli errori come "transitori" e riprovava in un ciclo infinito; Il tronco si è gonfiato e si è creato un carico non necessario. Hanno aggiunto la classificazione degli errori: 404 è considerato permanente, il ciclo viene interrotto e l'ID del modello viene corretto. Lezione: non ripetere ogni errore.

Caso 3 — Gestire il limite dal fronte. Un processo di arricchimento dei dati era costantemente in esecuzione al limite 429. Hanno seguito l'intestazione x-ratelimit-remaining e hanno limitato il traffico in base alla quota. Hanno quindi mantenuto un ritmo costante appena sotto il limite, senza prendere nessun 429; Il lavoro è stato svolto in modo più prevedibile e più rapido.

Errori comuni

  • Aumentare la velocità nel 429: peggiora la situazione; Passa alla ritirata.
  • Nuovo tentativo per ogni errore: 400/401/404 è permanente; Riprovare è uno spreco.
  • Utilizzo dell'attesa fissa: crea una collisione; Usa esponenziale + jitter.
  • Ignorare 'retry-after': è più accurato rispettare il tempo specificato dal fornitore.
  • Rivelare l’errore grezzo all’utente: fa vacillare la fiducia, crea vulnerabilità; Classificare all'interno.
  • Tentativi illimitati: imposta un limite massimo (ad esempio 5 tentativi); poi arrenditi con grazia.

Approfondimento: code, concorrenza e interruttori automatici

La sopportazione di un singolo desiderio è il primo passo; La vera maturità è gestire un gran numero di richieste senza raggiungere i limiti. Qui entrano in gioco tre concetti.

Coda: metti le richieste in coda per inviarle a un ritmo controllato anziché immediatamente. La coda attenua gli improvvisi picchi di traffico: anche se arrivano 1.000 richieste contemporaneamente, la coda le rilascerà a una velocità inferiore al limite. In questo modo previeni il 429 e non devi preoccuparti di risolverlo.

Limite di concorrenza: limiti il ​​numero di richieste "nell'aria" contemporaneamente. Le richieste parallele illimitate riempiono rapidamente i limiti RPM e TPM. Un limite di concorrenza ragionevole (ad esempio non più di 10 richieste simultanee) mantiene i limiti e rende il sistema prevedibile.

Interruttore automatico: se il provider continua a restituire 500/529, invece di provare ostinatamente ogni richiesta, "interrompi il circuito" per un po' e fallisci rapidamente la richiesta senza mai inviarla. Dopo un'attesa, riaccendi il circuito e prova. Questo modello impedisce il crash del sistema in caso di guasto temporaneo del provider.

Insieme, questi tre stabiliscono la resilienza a livello di sistema oltre la logica dei tentativi di una singola chiamata. Su piccola scala, il nuovo tentativo automatico dell'SDK è sufficiente; Man mano che la scala cresce, le code, la concorrenza e gli interruttori automatici diventano indispensabili. Hanno tutti lo stesso obiettivo comune: mostrare all'utente un problema temporaneo non come un arresto anomalo, ma come un ritardo invisibile di pochi secondi.

In sintesi

429 ritorna quando vengono superati i limiti di velocità (RPM/ITPM/OTPM); Si tratta di un errore temporaneo e verrà effettuato un nuovo tentativo utilizzando il retry-after e il backoff esponenziale + jitter. 500 e 529 sono anch'essi provvisori; 400/401/403/404 è un problema di richiesta/identità e non può essere risolto riprovando. Un flusso robusto separa gli errori in questi due gruppi, tenta un numero limitato di volte, monitora il limite dalla parte anteriore e mostra messaggi tranquilli all'utente.

Compito dell'applicazione

Considera la tua integrazione. (1) Elenca i codici di errore che potresti riscontrare e separali in "riprovabili/permanenti". (2) Annotare il piano di pullback esponenziale (mantenimento iniziale, coefficiente, limite, jitter). (3) Specificare come utilizzare l'intestazione riprova dopo. (4) Scrivere il messaggio gentile da visualizzare all'utente una volta esauriti i tentativi.

lista di controllo

  • [ ] Posso spiegare i limiti RPM/ITPM/OTPM e 429.
  • [] Posso applicare la logica del ritiro esponenziale + jitter + retry-after.
  • [ ] Posso classificare i codici di errore come riprovabili/permanenti.
  • [ ] So che non dovremmo tentare ogni errore.
  • [ ] Invece di un errore grezzo, posso mostrare all'utente un messaggio calmo e orientato all'azione.