Questa pagina descrive come gli strumenti Cloud Storage riprovano le richieste non riuscite e come personalizzare il comportamento dei tentativi. Descrive inoltre le considerazioni per i tentativi di richiesta.
Panoramica
Esistono due fattori che determinano se è sicuro o meno riprovare una richiesta:
La risposta che ricevi dalla richiesta.
L'idempotenza della richiesta.
Risposta
La risposta che ricevi dalla richiesta indica se è utile riprovare. Le risposte relative a problemi temporanei sono generalmente riproducibili. D'altra parte, la risposta relativa agli errori permanenti indica che devi apportare modifiche, ad esempio modifiche di autorizzazione o configurazione, prima che sia utile riprovare a effettuare la richiesta. Le seguenti risposte indicano problemi temporanei che è utile riprovare:
- Codici di risposta HTTP
408
,429
e5xx
. - Timeout dei socket e disconnessioni TCP.
Per ulteriori informazioni, consulta lo stato e i codici di errore per JSON e XML.
Idempotenza
Le richieste idempotenti possono essere eseguite ripetutamente senza modificare lo stato finale della risorsa di destinazione, con lo stesso stato finale ogni volta. Ad esempio, le operazioni di elenco sono sempre idempotenti perché queste richieste non modificano le risorse. D'altra parte, la creazione di una nuova notifica Pub/Sub non è mai idempotente, perché crea un nuovo ID notifica ogni volta che la richiesta va a buon fine.
Di seguito sono riportati alcuni esempi di condizioni che rendono idempotente un'operazione:
L'operazione ha lo stesso effetto osservabile sulla risorsa di destinazione anche quando viene richiesta continuamente.
L'operazione ha esito positivo una sola volta.
L'operazione non ha alcun effetto osservabile sullo stato della risorsa di destinazione.
Quando ricevi una risposta riproponibile, devi considerare l'idempotenza della richiesta, perché riprovare le richieste non idempotenti può portare a condizioni di competizione e altri conflitti.
Idempotenza condizionale
Un sottoinsieme di richieste è idempotente in modo condizionale, il che significa che sono idempotenti solo se includono argomenti facoltativi specifici. Le operazioni che possono essere ritentate in modo condizionale devono essere ritentate per impostazione predefinita solo se la condizione viene soddisfatta. Cloud Storage accetta precondizioni ed ETag come casi di condizione per le richieste.
Idempotenza delle operazioni
La tabella seguente elenca le operazioni Cloud Storage che rientrano in ogni categoria di idempotenza.
Idempotenza | Operazioni |
---|---|
Sempre idempotente |
|
Idempotente in modo condizionale |
|
Mai idempotente |
|
1Questo campo è disponibile per l'utilizzo nell'API JSON. Per i campi disponibili per l'utilizzo nelle librerie client, consulta la documentazione della libreria client pertinente.
Come gli strumenti di Cloud Storage implementano le strategie di ripetizione
Console
La console Google Cloud invia richieste a Cloud Storage per tuo conto e gestisce qualsiasi backoff necessario.
Riga di comando
I comandi gcloud storage
riprovano a correggere gli errori elencati nella sezione Risposta senza richiedere ulteriori azioni da parte tua.
Potresti dover intervenire per altri errori, ad esempio:
Credenziali non valide o autorizzazioni insufficienti.
Rete non raggiungibile a causa di un problema di configurazione del proxy.
Per gli errori riproducibili, gcloud CLI riprova le richieste utilizzando una strategia di backoff esponenziale binario troncato. Il numero predefinito di tentativi massimi è 32 per gcloud CLI.
Librerie client
C++
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore HTTP, nonché per tutti gli errori di socket che indicano che la connessione è stata persa o non è mai stata stabilita correttamente.
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tutte le impostazioni di backoff esponenziale e dei nuovi tentativi nella libreria C++ sono configurabili. Se gli algoritmi implementati nella libreria non supportano le tue esigenze, puoi fornire codice personalizzato per implementare le tue strategie.
Impostazione | Valore predefinito |
---|---|
Nuovo tentativo automatico | Vero |
Tempo massimo per il nuovo tentativo di una richiesta | 15 minuti |
Tempo di attesa (backoff) iniziale | 1 secondo |
Moltiplicatore del tempo di attesa per iterazione | 2 |
Importo massimo del tempo di attesa | 5 minuti |
Per impostazione predefinita, la libreria C++ riprova tutte le operazioni con errori
ripetibili, anche quelle che non sono mai idempotenti e possono eliminare o creare
più risorse quando vengono eseguite ripetutamente. Per riprovare solo le operazioni idempotenti, utilizza la classe google::cloud::storage::StrictIdempotencyPolicy
.
C#
La libreria client C# utilizza il backoff esponenziale per impostazione predefinita.
Vai
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti errori:
- Errori di connessione:
io.ErrUnexpectedEOF
: questo problema può verificarsi a causa di problemi di rete temporanei.url.Error
contenenteconnection refused
: questo può verificarsi a causa di problemi di rete temporanei.url.Error
contenenteconnection reset by peer
: Ciò significa che Google Cloud ha reimpostato la connessione.net.ErrClosed
: significa che Google Cloud ha chiuso la connessione.
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
- Errori che implementano l'interfaccia
Temporary()
e restituiscono un valore dierr.Temporary() == true
- Uno qualsiasi degli errori precedenti di cui è stato eseguito il wrapping utilizzando il wrapping degli errori di Go 1.13
Tutte le impostazioni di backoff esponenziale nella libreria Go sono configurabili. Per impostazione predefinita, le operazioni in Go utilizzano le seguenti impostazioni per il backoff esponenziale (i valori predefiniti sono presi da gax):
Impostazione | Valore predefinito (in secondi) |
---|---|
Nuovo tentativo automatico | True se idempotente |
Numero massimo di tentativi | Nessun limite |
Ritardo iniziale nuovo tentativo | 1 secondo |
Moltiplicatore del ritardo di nuovi tentativi | 2.0 |
Ritardo massimo nuovo tentativo | 30 secondi |
Timeout totale (chunk di caricamento ripristinabile) | 32 secondi |
Timeout totale (tutte le altre operazioni) | Nessun limite |
In generale, i tentativi continuano all'infinito a meno che il contesto di controllo non venga annullato, il client non venga chiuso o venga ricevuto un errore non temporaneo. Per impedire che i tentativi vengano ripetuti, utilizza i timeout di contesto o
l'annullamento. L'unica eccezione a questo comportamento si verifica quando vengono eseguiti
caricamenti ripristinabili utilizzando Writer, dove i dati sono
abbastanza grandi da richiedere più richieste. In questo scenario, ogni
chunk scade e smette di riprovare dopo 32 secondi per impostazione predefinita. Puoi
modificare il timeout predefinito cambiando Writer.ChunkRetryDeadline
.
Esiste un sottoinsieme di operazioni Go che sono idempotenti in modo condizionale (sicure da riprovare in modo condizionale). Queste operazioni vengono ritentate solo se soddisfano condizioni specifiche:
GenerationMatch
oGeneration
- È possibile riprovare se è stata applicata una precondizione
GenerationMatch
alla chiamata o se è stato impostatoObjectHandle.Generation
.
- È possibile riprovare se è stata applicata una precondizione
MetagenerationMatch
- È possibile riprovare se alla chiamata è stata applicata una precondizione
MetagenerationMatch
.
- È possibile riprovare se alla chiamata è stata applicata una precondizione
Etag
- È possibile riprovare se il metodo inserisce un
etag
nel corpo della richiesta JSON. Utilizzato solo inHMACKeyHandle.Update
quandoHmacKeyMetadata.Etag
è stato impostato.
- È possibile riprovare se il metodo inserisce un
RetryPolicy
è impostato su RetryPolicy.RetryIdempotent
per impostazione predefinita. Consulta
Personalizzare i tentativi per esempi su come modificare il comportamento predefinito dei tentativi.
Java
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti errori:
- Errori di connessione:
Connection reset by peer
: Ciò significa che Google Cloud ha reimpostato la connessione.Unexpected connection closure
: Ciò significa che Google Cloud ha chiuso la connessione.
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tutte le impostazioni di backoff esponenziale nella libreria Java sono configurabili. Per impostazione predefinita, le operazioni tramite Java utilizzano le seguenti impostazioni per il backoff esponenziale:
Impostazione | Valore predefinito (in secondi) |
---|---|
Nuovo tentativo automatico | True se idempotente |
Numero massimo di tentativi | 6 |
Ritardo iniziale nuovo tentativo | 1 secondo |
Moltiplicatore del ritardo di nuovi tentativi | 2.0 |
Ritardo massimo nuovo tentativo | 32 secondi |
Timeout totale | 50 secondi |
Timeout RPC iniziale | 50 secondi |
Moltiplicatore del timeout RPC | 1.0 |
Timeout RPC massimo | 50 secondi |
Timeout connessione | 20 secondi |
Timeout di lettura | 20 secondi |
Per ulteriori informazioni sulle impostazioni, consulta la documentazione di riferimento di Java per RetrySettings.Builder
e HttpTransportOptions.Builder
.
Esiste un sottoinsieme di operazioni Java che sono idempotenti in modo condizionale (sicure da riprovare in modo condizionale). Queste operazioni vengono ritentate solo se includono argomenti specifici:
ifGenerationMatch
ogeneration
- È sicuro riprovare se
ifGenerationMatch
ogeneration
è stato superato come opzione per il metodo.
- È sicuro riprovare se
ifMetagenerationMatch
- È sicuro riprovare se
ifMetagenerationMatch
è stato passato come opzione.
- È sicuro riprovare se
StorageOptions.setStorageRetryStrategy
è impostato su
StorageRetryStrategy#getDefaultStorageRetryStrategy
per impostazione predefinita.
Consulta Personalizzare i tentativi per esempi su come modificare il comportamento predefinito
dei tentativi.
Node.js
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore:
- Errori di connessione:
EAI_again
: si tratta di un errore di ricerca DNS. Per saperne di più, consulta la documentazionegetaddrinfo
.Connection reset by peer
: Ciò significa che Google Cloud ha reimpostato la connessione.Unexpected connection closure
: Ciò significa che Google Cloud ha chiuso la connessione.
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tutte le impostazioni di backoff esponenziale nella libreria Node.js sono configurabili. Per impostazione predefinita, le operazioni tramite Node.js utilizzano le seguenti impostazioni per il backoff esponenziale:
Impostazione | Valore predefinito (in secondi) |
---|---|
Nuovo tentativo automatico | True se idempotente |
Numero massimo di nuovi tentativi | 3 |
Tempo di attesa iniziale | 1 secondo |
Moltiplicatore del tempo di attesa per iterazione | 2 |
Importo massimo del tempo di attesa | 64 secondi |
Scadenza predefinita | 600 secondi |
Esiste un sottoinsieme di operazioni Node.js che sono idempotenti in modo condizionale (sicure da riprovare in modo condizionale). Queste operazioni vengono ritentate solo se includono argomenti specifici:
ifGenerationMatch
ogeneration
- È sicuro riprovare se
ifGenerationMatch
ogeneration
è stato superato come opzione per il metodo. Spesso, i metodi accettano solo uno di questi due parametri.
- È sicuro riprovare se
ifMetagenerationMatch
- È sicuro riprovare se
ifMetagenerationMatch
è stato passato come opzione.
- È sicuro riprovare se
retryOptions.idempotencyStrategy
è impostato su
IdempotencyStrategy.RetryConditional
per impostazione predefinita. Consulta
Personalizzare i tentativi per esempi su come modificare il comportamento predefinito dei tentativi.
PHP
La libreria client PHP utilizza il backoff esponenziale per impostazione predefinita.
Python
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore:
- Errori di connessione:
requests.exceptions.ConnectionError
requests.exceptions.ChunkedEncodingError
(solo per le operazioni che recuperano o inviano dati di payload agli oggetti, come caricamenti e download)ConnectionError
http.client.ResponseNotReady
urllib3.exceptions.TimeoutError
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Le operazioni tramite Python utilizzano le seguenti impostazioni predefinite per il backoff esponenziale:
Impostazione | Valore predefinito (in secondi) |
---|---|
Nuovo tentativo automatico | True se idempotente |
Tempo di attesa iniziale | 1 |
Moltiplicatore del tempo di attesa per iterazione | 2 |
Importo massimo del tempo di attesa | 60 |
Scadenza predefinita | 120 |
Oltre alle operazioni di Cloud Storage che sono sempre idempotenti, la libreria client Python ritenta automaticamente Objects: insert, Objects: delete e Objects: patch per impostazione predefinita.
Esiste un sottoinsieme di operazioni Python che sono idempotenti in modo condizionale (sicure da riprovare in modo condizionale) quando includono argomenti specifici. Queste operazioni vengono riprovate solo se viene superato un caso di condizione:
DEFAULT_RETRY_IF_GENERATION_SPECIFIED
- È possibile riprovare se
generation
oif_generation_match
è stato passato come argomento al metodo. Spesso i metodi accettano solo uno di questi due parametri.
- È possibile riprovare se
DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
- È possibile riprovare se
if_metageneration_match
è stato passato come argomento al metodo.
- È possibile riprovare se
DEFAULT_RETRY_IF_ETAG_IN_JSON
- È possibile riprovare se il metodo inserisce un
etag
nel corpo della richiesta JSON. PerHMACKeyMetadata.update()
, ciò significa che l'etag deve essere impostato sull'oggettoHMACKeyMetadata
stesso. Per il metodoset_iam_policy()
in altre classi, ciò significa che l'etag deve essere impostato nell'argomento "policy" passato al metodo.
- È possibile riprovare se il metodo inserisce un
Ruby
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore:
- Errori di connessione:
SocketError
HTTPClient::TimeoutError
Errno::ECONNREFUSED
HTTPClient::KeepAliveDisconnected
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
5xx Server Error
Tutte le impostazioni di backoff esponenziale nella libreria client Ruby sono configurabili. Per impostazione predefinita, le operazioni tramite la libreria client Ruby utilizzano le seguenti impostazioni per il backoff esponenziale:
Impostazione | Valore predefinito |
---|---|
Nuovo tentativo automatico | Vero |
Numero massimo di nuovi tentativi | 3 |
Tempo di attesa iniziale | 1 secondo |
Moltiplicatore del tempo di attesa per iterazione | 2 |
Importo massimo del tempo di attesa | 60 secondi |
Scadenza predefinita | 900 secondi |
Esiste un sottoinsieme di operazioni Ruby che sono idempotenti in modo condizionale (sicure da riprovare in modo condizionale) quando includono argomenti specifici:
if_generation_match
ogeneration
- È possibile riprovare se il parametro
generation
oif_generation_match
viene passato come argomento al metodo. Spesso i metodi accettano solo uno di questi due parametri.
- È possibile riprovare se il parametro
if_metageneration_match
- È possibile riprovare se il parametro
if_metageneration_match
viene passato come opzione.
- È possibile riprovare se il parametro
Per impostazione predefinita, viene eseguito un nuovo tentativo di tutte le operazioni idempotenti e delle operazioni idempotenti condizionali solo se la condizione viene soddisfatta. Le operazioni non idempotenti non vengono riprovate. Consulta Personalizzare i tentativi per esempi su come modificare il comportamento predefinito dei tentativi.
API REST
Quando chiami direttamente l'API JSON o XML, devi utilizzare l'algoritmo di backoff esponenziale per implementare la tua strategia di nuovi tentativi.
Personalizzazione dei tentativi
Console
Non puoi personalizzare il comportamento dei tentativi utilizzando la Google Cloud console.
Riga di comando
Per i comandi gcloud storage
, puoi controllare la strategia di ripetizione creando una configurazione denominata e impostando alcune o tutte le seguenti proprietà:
Impostazione | Valore predefinito (in secondi) |
---|---|
base_retry_delay |
1 |
exponential_sleep_multiplier |
2 |
max_retries |
32 |
max_retry_delay |
32 |
Applica quindi la configurazione definita in base al comando utilizzando il flag a livello di progetto --configuration
o per tutti i comandi Google Cloud CLI utilizzando il comando gcloud config set
.
Librerie client
C++
Per personalizzare il comportamento di ripetizione, fornisci i valori per le seguenti opzioni
quando inizializzi l'oggetto google::cloud::storage::Client
:
google::cloud::storage::RetryPolicyOption
: la libreria fornisce le classigoogle::cloud::storage::LimitedErrorCountRetryPolicy
egoogle::cloud::storage::LimitedTimeRetryPolicy
. Puoi fornire la tua classe, che deve implementare l'interfacciagoogle::cloud::RetryPolicy
.google::cloud::storage::BackoffPolicyOption
: La libreria fornisce la classegoogle::cloud::storage::ExponentialBackoffPolicy
. Puoi fornire la tua classe, che deve implementare l'interfacciagoogle::cloud::storage::BackoffPolicy
.google::cloud::storage::IdempotencyPolicyOption
: la libreria fornisce le classigoogle::cloud::storage::StrictIdempotencyPolicy
egoogle::cloud::storage::AlwaysRetryIdempotencyPolicy
. Puoi fornire la tua classe, che deve implementare l'interfacciagoogle::cloud::storage::IdempotencyPolicy
.
Per saperne di più, consulta la documentazione di riferimento della libreria client C++.
C#
Non puoi personalizzare la strategia di ripetizione predefinita utilizzata dalla libreria client C#.
Vai
Quando inizializzi un client di archiviazione, viene impostata una configurazione di nuovi tentativi predefinita. A meno che non vengano sostituite, le opzioni nella configurazione sono impostate sui valori predefiniti. Gli utenti possono configurare un comportamento di ripetizione non predefinito per una singola chiamata di libreria (utilizzando BucketHandle.Retryer e ObjectHandle.Retryer) o per tutte le chiamate effettuate da un client (utilizzando Client.SetRetry). Per modificare il comportamento dei tentativi, passa le RetryOptions pertinenti a uno di questi metodi.
Consulta il seguente esempio di codice per scoprire come personalizzare il comportamento dei tentativi.
Java
Quando inizializzi Storage
, viene inizializzata anche un'istanza di
RetrySettings
. A meno che non vengano
ignorate, le opzioni in RetrySettings
sono impostate sui
valori predefiniti. Per modificare il comportamento predefinito di ripetizione automatica, passa
il StorageRetryStrategy
personalizzato in StorageOptions
utilizzato per
costruire l'istanza Storage
. Per modificare uno qualsiasi degli altri parametri
scalari, passa un RetrySettings
personalizzato in StorageOptions
utilizzato
per creare l'istanza Storage
.
Consulta l'esempio seguente per scoprire come personalizzare il comportamento di ripetizione:
Node.js
Quando inizializzi Cloud Storage, viene inizializzato anche un file di configurazione retryOptions. A meno che non vengano sostituite, le opzioni
nella configurazione sono impostate sui valori predefiniti. Per modificare il
comportamento predefinito dei tentativi, passa la configurazione personalizzata dei tentativi
retryOptions
al costruttore di archiviazione durante l'inizializzazione.
La libreria client Node.js può utilizzare automaticamente le strategie di backoff per
riprovare le richieste con il parametro autoRetry
.
Consulta il seguente esempio di codice per scoprire come personalizzare il comportamento dei tentativi.
PHP
Non puoi personalizzare la strategia di ripetizione predefinita utilizzata dalla libreria client PHP.
Python
Per modificare il comportamento di ripetizione predefinito, crea una copia dell'oggetto google.cloud.storage.retry.DEFAULT_RETRY
chiamandolo con un metodo with_XXX
. La libreria client Python utilizza automaticamente strategie di backoff
per riprovare le richieste se includi il parametro DEFAULT_RETRY
.
Tieni presente che with_predicate
non è supportato per le operazioni che recuperano o
inviano dati di payload agli oggetti, come caricamenti e download. Ti consigliamo di modificare gli attributi uno alla volta. Per saperne di più,
consulta il riferimento ai tentativi di google-api-core.
Per configurare un nuovo tentativo condizionale, crea un oggetto
ConditionalRetryPolicy
e racchiudi l'oggetto Retry
personalizzato
con DEFAULT_RETRY_IF_GENERATION_SPECIFIED
,
DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
o
DEFAULT_RETRY_IF_ETAG_IN_JSON
.
Consulta il seguente esempio di codice per scoprire come personalizzare il comportamento dei tentativi.
Ruby
Quando inizializzi il client di archiviazione, tutte le configurazioni dei tentativi vengono impostate sui valori mostrati nella tabella precedente. Per modificare il comportamento predefinito dei tentativi, trasmetti le configurazioni dei tentativi durante l'inizializzazione del client di archiviazione.
Per ignorare il numero di tentativi per una determinata operazione, passa
retries
nel parametro options
dell'operazione.
API REST
Utilizza l'algoritmo di backoff esponenziale per implementare la tua strategia di nuovi tentativi.
Algoritmo di backoff esponenziale
Un algoritmo di backoff esponenziale riprova le richieste utilizzando tempi di attesa tra le richieste che aumentano in modo esponenziale, fino a un tempo massimo di backoff. In genere, devi utilizzare il backoff esponenziale con jitter per ritentare le richieste che soddisfano sia i criteri di risposta che quelli di idempotenza. Per le best practice per l'implementazione di tentativi automatici con backoff esponenziale, vedi Gestione degli errori a cascata.
Anti-pattern per i nuovi tentativi
Ti consigliamo di utilizzare o personalizzare i meccanismi di ripetizione integrati, se applicabili. Per maggiori informazioni, consulta la sezione Personalizzazione dei tentativi. Che tu stia utilizzando i meccanismi di ripetizione predefiniti, li stia personalizzando o stia implementando una logica di ripetizione personalizzata, è fondamentale evitare i seguenti anti-pattern comuni, in quanto possono esacerbare i problemi anziché risolverli.
Nuovo tentativo senza backoff
I nuovi tentativi di richiesta immediati o con ritardi molto brevi possono causare errori a cascata, ovvero errori che potrebbero attivare altri errori.
Come evitare questo problema: implementa il backoff esponenziale con jitter. Questa strategia aumenta progressivamente il tempo di attesa tra i tentativi e aggiunge un elemento casuale per evitare che i tentativi sovraccarichino il servizio.
Ritentare in modo incondizionato le operazioni non idempotenti
L'esecuzione ripetuta di operazioni non idempotenti può portare a effetti collaterali indesiderati, come sovrascritture o eliminazioni involontarie di dati.
Come evitare questo problema: comprendi a fondo le caratteristiche di idempotenza di ogni operazione, come descritto nella sezione Idempotenza delle operazioni. Per le operazioni non idempotenti, assicurati che la logica di ripetizione possa gestire i potenziali duplicati o evitare di riprovare. Fai attenzione ai nuovi tentativi che potrebbero portare a race condition.
Riprova degli errori non riprovabili
Considerare tutti gli errori come riprovabili può essere problematico. Alcuni errori, ad esempio errori di autorizzazione o richieste non valide, sono persistenti e il loro nuovo tentativo senza risolvere la causa sottostante non andrà a buon fine e potrebbe comportare l'inserimento delle applicazioni in un ciclo infinito.
Come evitare questo problema: classifica gli errori in temporanei (riprovabili) e permanenti (non riprovabili). Riprova solo gli errori temporanei come i codici HTTP 408
, 429
e 5xx
o problemi di connessione specifici. Per gli errori permanenti, registrali e gestisci la causa sottostante in modo appropriato.
Ignorare i limiti di nuovi tentativi
I nuovi tentativi a tempo indeterminato possono causare l'esaurimento delle risorse nell'applicazione o inviare continuamente richieste a un servizio che non verrà ripristinato senza intervento.
Come evitare questo problema: adatta i limiti di nuovi tentativi alla natura del tuo workload. Per i carichi di lavoro sensibili alla latenza, valuta la possibilità di impostare una durata totale massima dei tentativi per garantire una risposta o un errore tempestivi. Per i carichi di lavoro batch, che potrebbero tollerare periodi di nuovi tentativi più lunghi per errori temporanei lato server, valuta la possibilità di impostare un limite totale di nuovi tentativi più elevato.
Tentativi inutilmente stratificati
L'aggiunta di una logica di ripetizione a livello di applicazione personalizzata in aggiunta ai meccanismi di ripetizione esistenti può comportare un numero eccessivo di tentativi. Ad esempio, se la tua applicazione ritenta un'operazione tre volte e la libreria client sottostante la ritenta tre volte per ogni tentativo dell'applicazione, potresti ritrovarti con nove tentativi. L'invio di un numero elevato di nuovi tentativi per errori che non possono essere riprovati potrebbe comportare il throttling delle richieste, limitando la velocità effettiva di tutti i carichi di lavoro. Un numero elevato di tentativi potrebbe anche aumentare la latenza delle richieste senza migliorare la percentuale di successo.
Come evitare questo problema: ti consigliamo di utilizzare e configurare i meccanismi di ripetizione integrati. Se devi implementare i tentativi a livello di applicazione, ad esempio per una logica di business specifica che si estende su più operazioni, fallo con una chiara comprensione del comportamento di ripetizione sottostante. Valuta la possibilità di disattivare o limitare in modo significativo i tentativi in uno dei livelli per evitare effetti moltiplicativi.
Passaggi successivi
- Scopri di più sulle precondizioni delle richieste.