In questa pagina viene descritto in che modo gli strumenti di Cloud Storage riprovano le richieste non riuscite. e come personalizzare il comportamento dei nuovi tentativi. Descrive inoltre e considerazioni per ritentare le richieste.
Panoramica
Esistono due fattori che determinano se è sicuro eseguire un nuovo tentativo di una richiesta:
- La risposta che ricevi dalla richiesta.
- L'idempotenza della richiesta.
Risposta
La risposta che ricevi indica se si tratta o meno di utile per ritentare la richiesta. Le risposte relative ai problemi temporanei vengono di solito ripetibili. Invece, le risposte relative agli errori permanenti. indicare che devi apportare modifiche, ad esempio all'autorizzazione o alla configurazione, modifiche, prima che sia utile riprovare la richiesta. Le seguenti risposte indicano problemi temporanei che è utile riprovare:
- Codici di risposta HTTP
408
,429
e5xx
. - Timeout del socket e disconnessioni TCP.
Per ulteriori informazioni, controlla i codici di stato e di errore per JSON e XML.
Idempotenza
Una richiesta idempotente significa che può essere eseguita ripetutamente e sempre e lascia la risorsa target nello stesso stato finale. Ad esempio, scheda sono sempre idempotenti, perché non modificano le risorse. D'altra parte, creare una nuova notifica Pub/Sub non è mai idempotente, perché crea un nuovo ID notifica ogni volta che la richiesta ha esito positivo.
Di seguito sono riportati alcuni esempi di condizioni che rendono idempotente un'operazione:
L'operazione ha lo stesso effetto osservabile sulla risorsa scelta come target quando richiesto continuamente.
L'operazione riesce una sola volta.
L'operazione non ha alcun effetto osservabile sullo stato della risorsa target.
Quando ricevi una risposta che può essere riprovata, devi considerare l'idempotenza della richiesta, perché ritentare richieste non idempotenti può portare sulle condizioni di gara e altri conflitti.
IDempotenza condizionale
Un sottoinsieme di richieste è condizionatamente idempotente, il che significa che vengono idempotenti se includono argomenti facoltativi specifici. Operazioni che sono Un nuovo tentativo sicuro in base alle condizioni deve essere ripetuto per impostazione predefinita solo se la condizione non supera la richiesta di assistenza. Cloud Storage accetta precondizioni ed ETag come le richieste di condizioni per le richieste.
Idempotenza delle operazioni
La tabella seguente elenca le operazioni di Cloud Storage che rientrano in ogni categoria di idempotenza.
Idempotenza | Operazioni |
---|---|
Sempre idempotente |
|
IDempotente condizionale |
|
Mai idempotente |
|
1 Questo campo può essere utilizzato nell'API JSON. Per i campi disponibili per l'uso nelle librerie client, consulta i documentazione relativa alla libreria client.
In che modo gli strumenti di Cloud Storage implementano le strategie di ripetizione
Console
La console Google Cloud invia richieste a Cloud Storage sul tuo e gestisce qualsiasi backoff necessario.
Riga di comando
Comandi gcloud storage
riprovano a eseguire gli errori elencati in
nella sezione Risposta senza che tu debba intraprendere altre azioni.
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.
In caso di errori ripetibili, gcloud CLI ripete le richieste utilizzando un strategia di backoff esponenziale binario troncato. Il valore predefinito il numero massimo di nuovi tentativi è 32 per gcloud CLI.
Librerie client
C++
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore HTTP: nonché eventuali errori socket che indicano che la connessione è stata interrotta o e non è mai stato stabilito 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 di nuovo tentativo nella libreria C++ vengono configurabile. Se gli algoritmi implementati nella libreria non supportano in base alle tue esigenze, puoi fornire codice personalizzato per implementare le tue strategie.
Impostazione | Valore predefinito |
---|---|
Nuovo tentativo automatico | Vero |
Tempo massimo per i nuovi tentativi di una richiesta | 15 minuti |
Tempo di attesa iniziale (backoff) | 1 secondo |
Moltiplicatore del tempo di attesa per iterazione | 2 |
Quantità massima di tempo di attesa | 5 minuti |
Per impostazione predefinita, la libreria C++ proverà nuovamente a eseguire tutte le operazioni con possibilità
anche quelli che non sono mai idempotenti e che possono eliminare o creare
più risorse in caso di esito positivo ripetuto. Per riprovare solo idempotenti
operazioni, usa l'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
: questa situazione può essere dovuta a: problemi di rete temporanei.url.Error
contenenteconnection refused
: questa a causa di problemi di rete temporanei.url.Error
contenenteconnection reset by peer
: Ciò significa che Google Cloud ha reimpostato la connessione.net.ErrClosed
: indica che Google Cloud ha 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 assegnano un valore dierr.Temporary() == true
- Uno qualsiasi degli errori riportati sopra che è stato aggregato utilizzando wrapping degli errori 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 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 tentativo iniziale | 1 secondo |
Moltiplicatore per ritardo nuovi tentativi | 2.0 |
Ritardo massimo nuovi tentativi | 30 secondi |
Timeout totale (chunk di caricamento ripristinabile) | 32 secondi |
Timeout totale (tutte le altre operazioni) | Nessun limite |
In generale, il nuovo tentativo continua a tempo indeterminato a meno che il valore di controllo
contesto viene annullato, il client è chiuso oppure viene generato un errore non temporaneo
ricevuto. Per impedire che i nuovi tentativi continuino, utilizza il timeout del contesto o
l'annullamento. L'unica eccezione a questo comportamento si verifica quando si esegue
di caricamenti ripristinabili utilizzando Writer, in cui i dati vengono
abbastanza grande da richiedere più richieste. In questo scenario, ogni
per impostazione predefinita il chunk si verifica in timeout e smette di riprovare dopo 32 secondi. Puoi
regola il timeout predefinito modificando Writer.ChunkRetryDeadline
.
Esiste un sottoinsieme di operazioni Go condizionalmente idempotente (condizionalmente sicuro, se puoi riprovare). Queste operazioni ritentano solo se soddisfano determinate condizioni:
GenerationMatch
oGeneration
- Riprovare se è stata applicata una precondizione
GenerationMatch
al o se è stato impostatoObjectHandle.Generation
.
- Riprovare se è stata applicata una precondizione
MetagenerationMatch
- Riprovare se è stata applicata una precondizione
MetagenerationMatch
alla chiamata.
- Riprovare se è stata applicata una precondizione
Etag
- Riprova se il metodo inserisce un
etag
nella richiesta JSON del testo. Utilizzato solo inHMACKeyHandle.Update
quandoHmacKeyMetadata.Etag
impostato.
- Riprova se il metodo inserisce un
RetryPolicy
è impostato su RetryPolicy.RetryIdempotent
per impostazione predefinita. Consulta:
Personalizza i nuovi tentativi per trovare esempi su come modificare il nuovo tentativo predefinito.
comportamento degli utenti.
Java
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti errori:
- Errori di connessione:
Connection reset by peer
: indica che Google Cloud è stato reimpostato la connessione.Unexpected connection closure
: 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. Di per impostazione predefinita, le operazioni mediante Java utilizzano le seguenti impostazioni per backoff esponenziale:
Impostazione | Valore predefinito (in secondi) |
---|---|
Nuovo tentativo automatico | True se idempotente |
Numero massimo di tentativi | 6 |
Ritardo tentativo iniziale | 1 secondo |
Moltiplicatore per ritardo nuovi tentativi | 2.0 |
Ritardo massimo nuovi tentativi | 32 secondi |
Timeout totale | 50 secondi |
Timeout RPC iniziale | 50 secondi |
Moltiplicatore timeout RPC | 1,0 |
Timeout RPC massimo | 50 secondi |
Timeout connessione | 20 secondi |
Timeout lettura | 20 secondi |
Per ulteriori informazioni sulle impostazioni, consulta la documentazione di riferimento di Java
documentazione per RetrySettings.Builder
e
HttpTransportOptions.Builder
.
Esiste un sottoinsieme di operazioni Java idempotente condizionalmente (condizionatamente sicuro si può riprovare). Queste operazioni riprova solo se includono argomenti specifici:
ifGenerationMatch
ogeneration
- Riprova se è stato superato
ifGenerationMatch
ogeneration
come opzione per il metodo.
- Riprova se è stato superato
ifMetagenerationMatch
- Riprova se è stato passato
ifMetagenerationMatch
come opzione.
- Riprova se è stato passato
Il valore di StorageOptions.setStorageRetryStrategy
è impostato su
StorageRetryStrategy#getDefaultStorageRetryStrategy
per impostazione predefinita.
Consulta Personalizzare i nuovi tentativi per avere esempi su come modificare le impostazioni predefinite
e riprova.
Node.js
Per impostazione predefinita, le operazioni supportano i nuovi tentativi per i seguenti codici di errore:
- Errori di connessione:
EAI_again
: questo è un errore di ricerca DNS. Per ulteriori informazioni, vedi la documentazione digetaddrinfo
.Connection reset by peer
: indica che Google Cloud è stato reimpostato la connessione.Unexpected connection closure
: 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 usano le seguenti impostazioni per 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 |
Quantità massima di tempo di attesa | 64 secondi |
Scadenza predefinita | 600 secondi |
Esiste un sottoinsieme di operazioni Node.js con condizioni idempotente (condizionalmente sicuro, se puoi riprovare). Queste operazioni ritentano solo se includono argomenti specifici:
ifGenerationMatch
ogeneration
- Riprova se è stato superato
ifGenerationMatch
ogeneration
come opzione per il metodo. Spesso, i metodi accettano solo uno di questi due parametri.
- Riprova se è stato superato
ifMetagenerationMatch
- Riprova se è stato passato
ifMetagenerationMatch
come opzione.
- Riprova se è stato passato
Il valore di retryOptions.idempotencyStrategy
è impostato su
IdempotencyStrategy.RetryConditional
per impostazione predefinita. Consulta:
Personalizza i nuovi tentativi per trovare esempi su come modificare il nuovo tentativo predefinito.
comportamento degli utenti.
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 recuperare o inviare dati payload agli oggetti, come caricamenti e download)ConnectionError
- Codici HTTP:
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Le operazioni mediante Python usano le seguenti impostazioni predefinite per 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 |
Quantità massima di tempo di attesa | 60 |
Scadenza predefinita | 120 |
Esiste un sottoinsieme di operazioni Python condizionalmente idempotenti (condizionalmente sicuri da riprovare) quando includono specifiche argomenti. Queste operazioni ritentano solo se si verifica una richiesta di condizione tessere:
DEFAULT_RETRY_IF_GENERATION_SPECIFIED
- Riprova se è stato superato
generation
oif_generation_match
come argomento al metodo. Spesso i metodi accettano solo uno di questi due parametri.
- Riprova se è stato superato
DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
- È possibile riprovare se
if_metageneration_match
è stato trasmesso come al metodo.
- È possibile riprovare se
DEFAULT_RETRY_IF_ETAG_IN_JSON
- Riprova se il metodo inserisce un
etag
nella richiesta JSON del testo. PerHMACKeyMetadata.update()
, questo significa che l'etag deve essere impostato su l'oggettoHMACKeyMetadata
stesso. Perset_iam_policy()
su altre classi, significa che l'etag deve essere impostato nel "norme" passato nel metodo.
- Riprova 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 configurabile. 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 |
Quantità massima di tempo di attesa | 60 secondi |
Scadenza predefinita | 900 secondi |
Esiste un sottoinsieme di operazioni Ruby con condizioni idempotenti (condizionalmente sicuri da riprovare) quando includono specifiche argomenti:
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, vengono ritentati tutte le operazioni idempotenti e in modo condizionale le operazioni idempotenti vengono ritentate solo se viene rispettata la condizione caso. Le operazioni non idempotenti non vengono tentate di nuovo. Vedi Personalizzare i nuovi tentativi. per vedere degli esempi su come modificare il comportamento predefinito per i nuovi tentativi.
API REST
Quando chiami direttamente l'API JSON o XML, devi utilizzare il metodo l'algoritmo di backoff esponenziale per implementare la tua strategia di ripetizione.
Personalizzazione dei nuovi tentativi
Console
Non puoi personalizzare il comportamento dei nuovi tentativi utilizzando la console Google Cloud.
Riga di comando
Per i comandi gcloud storage
, puoi controllare la strategia per i nuovi tentativi
creando una configurazione con nome e impostando alcune o tutte le
seguenti proprietà:
base_retry_delay
exponential_sleep_multiplier
max_retries
max_retry_delay
Puoi quindi applicare la configurazione definita per ogni comando,
usando il flag a livello di progetto --configuration
o per tutti gli strumenti
utilizzando il comando gcloud config set
.
Librerie client
C++
Per personalizzare il comportamento dei nuovi tentativi, fornisci valori per le seguenti opzioni
quando inizializza l'oggetto google::cloud::storage::Client
:
google::cloud::storage::RetryPolicyOption
: la raccolta forniscegoogle::cloud::storage::LimitedErrorCountRetryPolicy
egoogle::cloud::storage::LimitedTimeRetryPolicy
corsi. Puoi fornire la propria classe, che deve implementare interfaccia digoogle::cloud::RetryPolicy
.google::cloud::storage::BackoffPolicyOption
: la raccolta fornisce la classegoogle::cloud::storage::ExponentialBackoffPolicy
. Puoi fornire la propria classe, che deve implementare interfaccia digoogle::cloud::storage::BackoffPolicy
.google::cloud::storage::IdempotencyPolicyOption
: la raccolta fornisce igoogle::cloud::storage::StrictIdempotencyPolicy
egoogle::cloud::storage::AlwaysRetryIdempotencyPolicy
corsi. Tu puoi fornire la tua classe, che deve implementare interfaccia digoogle::cloud::storage::IdempotencyPolicy
.
Per ulteriori informazioni, consulta la documentazione di riferimento della libreria client C++.
C#
Non puoi personalizzare la strategia predefinita per i nuovi tentativi utilizzata libreria client C#.
Vai
Quando inizializzi un client di archiviazione, verrà eseguita una configurazione predefinita per i nuovi tentativi da impostare. A meno che non vengano sostituite, le opzioni nella configurazione siano impostati sui valori predefiniti. Gli utenti possono configurare un comportamento non predefinito dei nuovi tentativi per una singola chiamata alla libreria (utilizzando BucketHandle.Retryer e ObjectHandle.Retryer) o per tutti chiamate effettuate da un client (utilizzando Client.SetRetry). Per modificare un nuovo tentativo del comportamento, passa il valore RetryOptions pertinente a uno di questi metodi. di machine learning.
Guarda l'esempio di codice riportato di seguito per scoprire come personalizzare un nuovo tentativo comportamento degli utenti.
Java
Quando si inizializza Storage
, viene generata un'istanza di
Anche RetrySettings
è stato inizializzato. A meno che non siano
con override, le opzioni in RetrySettings
sono impostate sul
valori predefiniti. Per modificare il comportamento predefinito per i nuovi tentativi automatici, supera
lo StorageRetryStrategy
personalizzato nella StorageOptions
usata
per creare l'istanza Storage
. Per modificare qualsiasi altro modello scalare,
parametri, passa un valore RetrySettings
personalizzato al valore StorageOptions
utilizzato
per creare l'istanza Storage
.
Consulta l'esempio seguente per scoprire come personalizzare il comportamento dei nuovi tentativi:
Node.js
Quando inizializza Cloud Storage, viene eseguita una configurazione
viene inizializzato anche il file. A meno che non vengano sostituite, le opzioni
nella configurazione siano impostati sui valori predefiniti. Per modificare
comportamento predefinito per i nuovi tentativi, passa la configurazione personalizzata dei nuovi tentativi
retryOptions
nel costruttore di archiviazione al momento dell'inizializzazione.
La libreria client Node.js può utilizzare automaticamente le strategie di backoff per
con il parametro autoRetry
.
Guarda l'esempio di codice riportato di seguito per scoprire come personalizzare un nuovo tentativo comportamento degli utenti.
PHP
Non puoi personalizzare la strategia predefinita per i nuovi tentativi utilizzata con la libreria client PHP.
Python
Per modificare il comportamento predefinito per i nuovi tentativi, crea una copia del
google.cloud.storage.retry.DEFAULT_RETRY
oggetto chiamandolo con un
Metodo with_XXX
. La libreria client Python utilizza automaticamente il backoff
strategie per ritentare le richieste se includi DEFAULT_RETRY
.
Tieni presente che with_predicate
non è supportato per le operazioni che recuperano o
inviano dati payload agli oggetti, come caricamenti e download. È
consigliamo di modificare gli attributi uno alla volta. Per ulteriori informazioni,
consulta il riferimento google-api-core Riprova.
Per configurare un nuovo tentativo condizionale, crea un
ConditionalRetryPolicy
e aggregare l'oggetto Retry
personalizzato
oggetto con DEFAULT_RETRY_IF_GENERATION_SPECIFIED
,
DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
oppure
DEFAULT_RETRY_IF_ETAG_IN_JSON
.
Guarda l'esempio di codice riportato di seguito per scoprire come personalizzare un nuovo tentativo comportamento degli utenti.
Ruby
Quando inizializza il client di archiviazione, vengono impostate tutte le configurazioni dei nuovi tentativi ai valori mostrati nella tabella precedente. Per modificare il nuovo tentativo predefinito , passare le configurazioni dei nuovi tentativi durante l'inizializzazione del client di archiviazione.
Per sostituire il numero di nuovi tentativi per una determinata operazione, supera
retries
nel parametro options
dell'operazione.
API REST
Utilizza l'algoritmo di backoff esponenziale per implementare il tuo nuovo tentativo strategia.
Algoritmo di backoff esponenziale
Un algoritmo di backoff esponenziale riprova le richieste utilizzando aumentando in modo esponenziale i tempi di attesa tra le richieste, fino a un il tempo di backoff. In genere dovresti utilizzare il backoff esponenziale con il jitter per nuove richieste che soddisfino sia i criteri di risposta sia i criteri di idempotenza. Per il meglio che implementano i nuovi tentativi automatici con backoff esponenziale, consulta Gestire gli errori a cascata.
Passaggi successivi
- Scopri come ritentare le richieste in Storage Transfer Service con in Java o Python.
- Scopri di più sulle condizioni preliminari per richiedere.