View a markdown version of this page

Comportamento di ripetizione - AWS SDK e strumenti

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Comportamento di ripetizione

Importante

Il comportamento descritto in questa pagina richiede l'attivazione finché non diventa il comportamento predefinito. Imposta AWS_NEW_RETRIES_2026=true nel tuo ambiente. Senza questa impostazione, l'SDK utilizza un comportamento dei tentativi precedente al 2026, che differisce nei tempi di backoff, nei costi delle quote dei tentativi e nelle impostazioni predefinite specifiche del servizio. Per i dettagli, consulta il post sul blog dell'annuncio.

Quando una richiesta ad an Servizio AWS fallisce a causa di un errore temporaneo o di una limitazione, l'SDK può riprovare automaticamente la richiesta. Questa pagina spiega come configurare i tentativi e come funzionano internamente.

  • Configurazione dei tentativi: scegli una modalità di riprova, imposta il numero massimo di tentativi e comprendi la precedenza della configurazione.

  • Come funzionano i tentativi: flusso dei tentativi, classificazione degli errori, formula di backoff, meccanica delle quote di riprova e comportamento specifico del servizio.

Configurazione dei tentativi

Sei tu a controllare la strategia di ripetizione utilizzata dall'SDK e il numero di tentativi.

Scelta di una modalità di riprova

La modalità di riprova determina il comportamento dell'SDK quando una richiesta fallisce. Sono disponibili tre modalità: standard, adattiva e legacy.

Standard Adattiva Legacy
Riprova la quota Sì Sì Varia in base all'SDK
Può ritardare la richiesta iniziale No Sì No
Error-type-specific arretramento Sì Sì Varia in base all'SDK
Standardizzato tra gli SDK Sì Sì No
Raccomandazione Impostazione predefinita per tutti i carichi di lavoro Single-resource, con limitazioni elevate, tollerante alla latenza Solo compatibilità con le versioni precedenti

Modalità standard (impostazione predefinita)

La modalità standard riprova le richieste non riuscite utilizzando un backoff esponenziale con jitter. Utilizza ritardi più brevi per gli errori transitori (come i timeout di rete) e ritardi più lunghi per gli errori di limitazione (ad esempio). ThrottlingException

La modalità standard include una quota di tentativi, un bucket di token che detrae i token per ogni tentativo e li reintegra quando le richieste hanno esito positivo. Quando i token disponibili sono esauriti, l'SDK restituisce l'errore senza riprovare, in modo che l'applicazione fallisca rapidamente invece di attendere tentativi che difficilmente avranno esito positivo. Ciò consente inoltre di risolvere più rapidamente le interruzioni del servizio riducendo il traffico dei tentativi di ripetizione. Durante il normale funzionamento, la quota rimane piena e non ha alcun effetto. La quota di tentativi non ritarda o blocca mai la richiesta iniziale. Sono interessati solo i tentativi. Per informazioni dettagliate, vedi Riprova la quota (token bucket).

Usa la modalità standard a meno che tu non abbia un motivo specifico per scegliere un'altra modalità.

Modalità adattiva

La modalità adattiva include tutto ciò che è in modalità standard, oltre a un limitatore di velocità lato client. Il limitatore di velocità tiene traccia delle risposte di limitazione e regola la frequenza con cui l'SDK invia le richieste. A differenza della modalità standard, la modalità adattiva può ritardare o bloccare la richiesta iniziale, non solo i tentativi, quando viene rilevata una limitazione.

Il limitatore di velocità funziona per istanza del client SDK. Tutte le richieste di un client condividono lo stesso limite di velocità, indipendentemente dall'operazione o dalla risorsa API a cui sono destinate.

Quando usare la modalità adattiva:

  • Il tuo cliente si rivolge a una singola risorsa (ad esempio, una tabella DynamoDB) e ti aspetti risposte di limitazione frequenti. Questo è comune nei flussi di lavoro automatizzati, nei processori batch o nei carichi di lavoro AI che richiedono una singola operazione API ad alto volume.

  • Vuoi che l'SDK rallenti automaticamente quando il servizio segnala una limitazione.

Quando non usare la modalità adattiva:

  • Il cliente invia richieste a più risorse o serve più tenant. La limitazione di una risorsa fa sì che il limitatore di velocità rallenti tutte le richieste provenienti da quel client, comprese le richieste alle risorse non interessate.

  • È necessaria una latenza prevedibile sulla richiesta iniziale.

La modalità adattiva non è consigliata come impostazione predefinita generale.

Modalità Legacy

La modalità legacy è il comportamento di ripetizione utilizzato da ciascun SDK prima dell'introduzione della modalità standard. Non include una quota di tentativi standardizzata. Alcuni SDK (come Java) avevano le proprie implementazioni della quota di tentativi in modalità legacy, ma il comportamento non è coerente tra gli SDK. Senza una quota standardizzata, un cliente continua a riprovare a pieno ritmo durante le interruzioni del servizio. Ciò blocca i thread e le connessioni in caso di richieste che non hanno esito positivo, aggiungendo al contempo un carico che può ritardare il ripristino del servizio.

La modalità legacy varia a seconda degli SDK. Il numero di tentativi, i tempi di backoff, i set di errori rieseguibili e il comportamento di limitazione variano a seconda delle lingue. Il codice che dipende dal comportamento dei tentativi precedenti può comportarsi diversamente quando viene spostato tra gli SDK.

Disponibile in: Java, Python, Ruby, PHP, C++, CLI

Non disponibile in: .NET, Go, Kotlin, Rust, Swift, JavaScript

La modalità Legacy esiste per la compatibilità con le versioni precedenti. Se attualmente utilizzi la modalità legacy, passa alla modalità standard.

Riprova le impostazioni

Le seguenti impostazioni controllano il comportamento dei tentativi. È possibile impostarle tramite variabili di ambiente, il file di configurazione condiviso (~/.aws/config) o la configurazione del client in codice.

Impostazione Cosa controlla Variabile di ambiente Chiave del file di configurazione Predefinita
Riprova in modalità Quale strategia di riprova utilizzare AWS_RETRY_MODE retry_mode standard
Numero massimo di tentativi Tentativi totali inclusa la richiesta iniziale AWS_MAX_ATTEMPTS max_attempts 3(vedi note)

Un valore massimo di tentativi pari a 3 indica che l'SDK effettua una richiesta iniziale e fino a due tentativi. Imposta il numero massimo di tentativi per 1 disabilitare completamente i tentativi.

Nota

Per impostazione predefinita, i client DynamoDB e DynamoDB Streams impostano il numero massimo di tentativi. 4 Questi servizi utilizzano un ritardo di backoff di base più breve (25 ms anziché 50 ms) per adattarsi al loro profilo di bassa latenza. Il tentativo aggiuntivo mantiene il backoff massimo dell'ultimo tentativo paragonabile a quello di altri servizi. Puoi sovrascriverlo con le stesse impostazioni mostrate nella tabella precedente.

Precedenza di configurazione

Quando si specifica la stessa impostazione in più posizioni, l'SDK risolve il valore utilizzando la seguente precedenza, dalla più alta alla più bassa:

  1. Configurazione esplicita del client nel codice. Un valore impostato direttamente sul client SDK o sul relativo oggetto di configurazione.

  2. Variabile di ambiente. Ad esempio AWS_RETRY_MODE o AWS_MAX_ATTEMPTS.

  3. File di configurazione condiviso. retry_modemax_attemptsDigitare o~/.aws/config.

  4. SDK predefinito. L'impostazione predefinita incorporata.

Segue la precedenza di configurazione standard dell'AWS SDK. Un valore impostato a un livello superiore sovrascrive sempre un valore impostato a un livello inferiore. Ad esempio, se si imposta AWS_RETRY_MODE=adaptive come variabile di ambiente e retry_mode=standard si attiva~/.aws/config, l'SDK utilizza la modalità adattiva.

Language-specific configurazione

Le impostazioni cross-SDK descritte in questa pagina (retry_modeemax_attempts) funzionano in tutti gli SDK. Tuttavia, l'API per la configurazione dei tentativi nel codice varia in base alla lingua. Consulta la guida per sviluppatori del tuo SDK per le opzioni di configurazione specifiche della lingua, ad esempio strategie di backoff personalizzate, ulteriori errori rieseguibili e ottimizzazione delle quote dei tentativi.

Come funzionano i tentativi

Questa sezione descrive come gli AWS SDK gestiscono le richieste non riuscite: quali errori innescano i nuovi tentativi, quanto tempo l'SDK attende tra un tentativo e l'altro e quando interrompe il ritentativo.

Cosa succede quando una richiesta fallisce

Quando si effettua una chiamata API tramite un AWS SDK, l'SDK segue questa sequenza:

  1. Modalità adattivaSolo modalità adattiva: l'SDK controlla il limitatore di velocità sul lato client. Se viene rilevata una limitazione, l'SDK può ritardare o bloccare la richiesta prima di inviarla.

  2. L'SDK invia la richiesta all'endpoint. Servizio AWS

  3. Se il servizio restituisce una risposta positiva, l'SDK restituisce il risultato nel codice.

  4. Se la richiesta ha esito negativo, l'SDK classifica l'errore come transitorio, limitato o non ripetibile. Consulta Quali errori vengono ripetuti.

  5. Se l'errore non è ripetibile, l'SDK restituisce immediatamente l'errore nel codice. Non viene tentato alcun nuovo tentativo.

  6. Se l'errore può essere riprovato, l'SDK verifica se ha raggiunto il numero massimo di tentativi. In tal caso, restituisce l'errore nel codice.

  7. L'SDK controlla il. Riprova la quota (token bucket) Se il budget del token è esaurito, l'SDK non riprova e restituisce l'errore nel codice. Eccezione: perLong-polling operazioni, l'SDK applica comunque un ritardo di backoff prima di restituire l'errore.

  8. L'SDK calcola un ritardo di backoff in base al tipo di errore e al numero del tentativo di nuovo tentativo. Consulta Quanto dura l'SDK.

  9. L'SDK attende il ritardo calcolato, quindi invia nuovamente la richiesta dal passaggio 2.

L'SDK ripete questo ciclo finché la richiesta non ha esito positivo, viene raggiunto il numero massimo di tentativi, la quota di tentativi è esaurita o si verifica un errore non riutilizzabile. L'intero processo è automatico. La tua applicazione vede una risposta positiva o un errore finale.

Quali errori vengono ripetuti

L'SDK classifica ogni richiesta non riuscita in una delle tre categorie: transitoria, limitata o non riutilizzabile. Questa classificazione determina se l'SDK riprova la richiesta e quanto tempo attende prima di riprovare.

La classificazione si basa sul codice di errore e sul codice di stato HTTP nella risposta del servizio. Ad esempio, un HTTP 400 con il codice di errore RequestTimeout viene classificato come transitorio e ritentato. Un HTTP 400 with ValidationException è classificato come non ripetibile e viene restituito immediatamente.

Classificazione degli errori

Gli errori transitori vengono ritentati con un breve ritardo di base (50 ms):

Codice di errore
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O Errore (ripristino della connessione, errore di risoluzione DNS, timeout del socket)
(qualsiasi HTTP 500, 502, 503 o 504 senza un codice di errore riconosciuto)

Gli errori di limitazione vengono ritentati con un ritardo di base maggiore (1.000 ms):

Codice di errore
Throttling
ThrottlingException
ThrottledException
RequestThrottledException
TooManyRequestsException
ProvisionedThroughputExceededException
TransactionInProgressException
LimitExceededException
PriorRequestNotComplete
RequestThrottled
EC2ThrottledException
RequestLimitExceeded
SlowDown
BandwidthLimitExceeded

Non-retryable gli errori (comeAccessDeniedException,ValidationException,ResourceNotFoundException) vengono restituiti immediatamente al codice.

Nota

Un HTTP 5XX con un codice di errore di limitazione è classificato come errore di limitazione, non transitorio, anche se gli errori 5XX sono normalmente transitori. L'SDK corrisponde prima al codice di errore, quindi ritorna al codice di stato HTTP.

Gli errori di limitazione indicano che il servizio ha rifiutato attivamente la tua richiesta a causa dei limiti di velocità, quindi l'SDK attende più a lungo prima di riprovare per dare al servizio il tempo di recuperare la capacità. Consulta i ritardi specificiQuanto dura l'SDK.

Quanto dura l'SDK

L'SDK utilizza il backoff esponenziale con jitter completo. In media, ogni nuovo tentativo attende più a lungo del precedente, con la randomizzazione per distribuire le richieste provenienti da più client.

Ritardi di base per tipo di errore

Il ritardo di base dipende dal fatto che l'errore sia transitorio o limitativo:

Tipi di errore Ritardo base Rationale
Transitorio (senza limitazione) 50 ms Gli errori transitori si risolvono in genere in pochi millisecondi. Un breve ritardo di base consente un ripristino rapido.
Throttling 1.000 ms Il servizio ha una velocità limitata per la richiesta. Un ritardo di base più lungo consente di recuperare la capacità.

Formula di backoff

L'SDK calcola ogni ritardo tra i tentativi utilizzando questa formula:

delay = random(0, 1) × min(20,000 ms, base_delay × 2^retry)

Dove:

  • random(0, 1)restituisce un valore distribuito uniformemente tra 0 e 1

  • base_delayè 50 ms per gli errori transitori o 1.000 ms per gli errori di limitazione

  • retryparte da 0 per il primo tentativo (il secondo tentativo complessivo di richiesta)

Il limite massimo di backoff è di 20 secondi. Nessun ritardo individuale supera i 20 secondi indipendentemente dal numero di tentativi effettuati.

Esempi funzionanti

Esempio 1: errore transitorio, massimo 3 tentativi

Fase Cosa succede Ritardo
Tentativo 1 Richiesta iniziale. Il servizio restituisce HTTP 503. (nessuno)
Tentativo 2 L'SDK attende in modo casuale (0, 50 ms). Il tentativo non riesce con 503. 0-50 ms (media ~25 ms)
Tentativo 3 L'SDK attende in modo casuale (0, 100 ms). Il tentativo ha esito positivo. 0—100 ms (media ~50 ms)

La latenza totale aggiunta è in media di circa 75 ms in entrambi i tentativi.

Esempio 2: errore di limitazione, massimo 3 tentativi

Fase Cosa succede Ritardo
Tentativo 1 Richiesta iniziale. Il servizio restituisce 429Throttling. (nessuno)
Tentativo 2 L'SDK attende in modo casuale (0,1000 ms). Riprova restituisce 429. 0-1.000 ms (media ~500 ms)
Tentativo 3 L'SDK attende in modo casuale (0, 2.000 ms). Il tentativo ha esito positivo. 0—2.000 ms (media ~1.000 ms)

La latenza totale aggiunta è in media di circa 1.500 ms in entrambi i tentativi.

Esempio 3: errore transitorio, raggiungimento del limite di backoff

Con un ritardo base di 50 ms, il ritardo calcolato prima del limite sarebbe:

Tentativo di nuovo Ritardo massimo calcolato Dopo 20 s cap
1 50 ms 50 ms
2 100 ms 100 ms
5 800 ms 800 ms
9 12.800 ms 12.800 ms
10 25.600 ms 20.000 ms

Il limite entra in vigore al decimo tentativo (11° tentativo) per gli errori transitori. Per gli errori di limitazione con una base di 1.000 ms, il limite ha effetto al sesto tentativo.

Nota

Con l'impostazione predefinita di un massimo di 3 tentativi (1 richiesta iniziale + 2 tentativi), il limite massimo di backoff non viene mai raggiunto. Questa tabella illustra cosa succede se si aumenta max_attempts ben oltre il valore predefinito.

Perché il jitter è importante

Il moltiplicatore casuale si chiama full jitter. In caso contrario, tutti i client che riscontrano un errore contemporaneamente riproverebbero contemporaneamente, generando una raffica di traffico di tentativi (il problema del «thundering herd»). Il full jitter diffonde i tentativi in modo uniforme su tutta la finestra di backoff, in modo che il servizio riceva un flusso costante di richieste anziché picchi sincronizzati.

Ad esempio, supponiamo che 1.000 clienti ricevano tutti un 503 nello stesso momento. Il full jitter distribuisce i primi tentativi in modo uniforme su una finestra di 50 ms invece di avere tutti i 1.000 tentativi esattamente a 50 ms.

Server-directed tempistica dei nuovi tentativi

Alcune Servizi AWS includono un'x-amz-retry-afterintestazione nelle risposte di errore. Il valore dell'intestazione è un ritardo in millisecondi. Quando è presente questa intestazione, l'SDK utilizza il ritardo specificato dal server, limitato a un minimo del ritardo di backoff calcolato e a un massimo del ritardo di backoff calcolato più 5.000 ms. Poiché il backoff calcolato è a sua volta limitato a 20 secondi, il ritardo massimo effettivo diretto dal server è di 25 secondi. L'SDK non applica il jitter a questo valore, perché ci si aspetta che il servizio lo faccia. Ciò consente al servizio di comunicare esattamente quando prevede di avere capacità disponibile.

Riprova la quota (token bucket)

L'SDK mantiene un budget interno per i token che tiene traccia del rapporto tra richieste riuscite e fallimenti. Quando i guasti sono diffusi, il budget si esaurisce e l'SDK restituisce direttamente gli errori. L'applicazione fallisce rapidamente invece di attendere tentativi che difficilmente avranno esito positivo. Ciò riduce anche il traffico dei tentativi di ripetizione, aiutando a risolvere più rapidamente le interruzioni del servizio.

Come funziona la quota di tentativi

Il budget dei token inizia al completo. Ogni tentativo di nuovo tentativo detrae i token. Quando un nuovo tentativo ha esito positivo, l'SDK ripristina i token utilizzati da quel nuovo tentativo. Quando una richiesta ha esito positivo al primo tentativo (non sono necessari nuovi tentativi), l'SDK ripristina 1 token. Quando il budget raggiunge lo zero, l'SDK smette di riprovare e restituisce gli errori direttamente nel codice.

Parametro Valore
Capacità di bilancio 500 gettoni
Costo per tentativo temporaneo (senza limitazione) 14 gettoni
Costo per ogni nuovo tentativo di limitazione 5 gettoni
Token ripristinati in caso di successo dopo un nuovo tentativo Importo consumato dall'ultimo tentativo (14 o 5)
Gettoni ripristinati in caso di successo senza un nuovo tentativo 1 gettone

Il costo più elevato per i tentativi transitori riflette il loro diverso schema di errore. Gli errori transitori come 500s e gli errori di connessione spesso indicano un problema a livello di servizio. In queste situazioni, è improbabile che un nuovo tentativo abbia successo. Aumenta la latenza delle chiamate, limita le risorse del cliente e può ritardare il ripristino per tutti. Gli errori di limitazione indicano che il servizio ha bisogno di più tempo prima che la richiesta possa avere successo. L'SDK attende più a lungo tra un tentativo e l'altro per aumentare le probabilità di successo.

Quando viene eseguito il nuovo tentativo del blocco delle quote

La quota di tentativi tiene traccia dei token in ogni momento, ma blocca i tentativi solo quando il budget è esaurito. Durante il normale funzionamento, quasi tutte le richieste vengono soddisfatte e il budget rimane pieno. La quota non ha effetti osservabili sui nuovi tentativi.

Un nuovo tentativo riuscito ripristina solo il costo dei token (14 o 5 token), non il costo dei precedenti tentativi falliti nella stessa richiesta. Ad esempio, se il primo tentativo fallisce e il secondo va a buon fine, il budget perde 14 token netti. Il budget si esaurisce più rapidamente quando i tentativi esauriscono tutti i tentativi senza successo, ma si riduce anche gradualmente quando le richieste richiedono più tentativi prima di riuscire.

Con l'impostazione predefinita di un massimo di 3 tentativi, la quota inizia a diminuire quando più del 22% circa delle richieste comporta errori transitori prolungati o più del 32% circa in caso di errori di limitazione. Al di sotto di queste percentuali, le richieste riuscite rigenerano il budget più rapidamente di quanto i tentativi falliti lo esauriscano.

Il saldo iniziale del budget, pari a 500 token, fornisce un buffer in grado di assorbire brevi sequenze di errori. Un breve picco di errori, anche grave, non blocca i nuovi tentativi a meno che non persista abbastanza a lungo da esaurire il buffer.

Implicazioni pratiche

  • Bassi tassi di fallimento: la quota non ha effetto. Il budget rimane pari o prossimo alla capacità.

  • In caso di interruzione del servizio: se un'alta percentuale delle tue richieste fallisce per un periodo prolungato, la quota si esaurisce e il cliente riceve immediatamente gli errori invece di attendere nuovi tentativi. Ciò riduce la latenza sul lato client, libera thread e connessioni e aiuta il servizio a riprendersi più rapidamente.

  • Ripristino: quando il servizio viene ripristinato e le richieste ricominciano ad avere successo, i tentativi andati a buon fine ripristinano l'intero costo dei token e i tentativi riusciti al primo tentativo ripristinano 1 token. Il budget viene riempito gradualmente e i tentativi riprendono automaticamente.

  • Ambito: il budget del token è in genere limitato a una singola istanza del client SDK. L'ambito esatto può variare in base all'SDK. Non è condiviso tra processi o host.

Service-specific comportamento

DynamoDB

I client DynamoDB utilizzano impostazioni predefinite ottimizzate per il profilo a bassa latenza di DynamoDB:

Impostazione Impostazione predefinita generale Impostazione predefinita di DynamoDB
Ritardo base transitorio (senza limitazione) 50 ms 25 ms
Ritardo base di limitazione 1.000 ms 1.000 ms
Numero massimo di tentativi 3 4

Queste impostazioni predefinite si applicano sia ad Amazon DynamoDB che a DynamoDB Streams.

Long-polling operazioni

Alcune AWS operazioni utilizzano polling lunghi. Possono tenere aperta una connessione in attesa dell'arrivo del lavoro. Queste operazioni ricevono un trattamento speciale di riprova:

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

Comportamento speciale: quando la quota di tentativi è esaurita e i tentativi vengono bloccati (passaggio 7Cosa succede quando una richiesta fallisce), l'SDK applica comunque un ritardo di backoff prima di restituire l'errore al codice.

Questo è importante perché le operazioni di polling prolungato vengono in genere eseguite in un ciclo ristretto. Il codice chiamaReceiveMessage, elabora tutti i messaggi, quindi richiama ReceiveMessage immediatamente di nuovo. Senza il backoff forzato, un budget di token esaurito farebbe sì che l'SDK restituisca errori senza ritardi. Il ciclo di polling invierebbe quindi immediatamente la richiesta successiva, aumentando l'utilizzo della CPU del client e generando traffico aggiuntivo. Il ritardo di backoff forzato interrompe questo ciclo, mantenendo gestibili l'utilizzo delle risorse del cliente e la frequenza di polling durante gli errori.

Supporto di AWS SDK e strumenti

La tabella seguente elenca la disponibilità del comportamento di ripetizione aggiornato in ogni SDK. Per SDK-specific informazioni dettagliate, tra cui la versione minima, le impostazioni predefinite relative al periodo precedente e successivo e gli esempi di codice, consulta il problema di tracciamento. GitHub