Cette page explique comment les outils Cloud Storage relancent les requêtes ayant échoué et comment personnaliser le comportement des nouvelles tentatives. Elle décrit également les éléments à prendre en compte pour relancer des requêtes.
Présentation
Deux facteurs déterminent si une requête est sécurisée ou non pour une nouvelle tentative :
- La réponse que vous recevez de la requête.
- L'idempotence de la requête.
Réponse
La réponse que vous recevez de votre requête indique s'il est utile de réessayer la requête ou non. Les réponses correspondant à des problèmes temporaires peuvent généralement faire l'objet d'une nouvelle tentative. En revanche, une réponse associée à des erreurs permanentes indique que vous devez apporter des modifications, par exemple au niveau des autorisations ou de la configuration, avant de pouvoir relancer la requête. Les réponses suivantes traduisent des problèmes temporaires, pour lesquels il est utile de réessayer :
- Codes de réponse HTTP
408
,429
et5xx
- les délais d'expiration de sockets et les déconnexions TCP.
Pour en savoir plus, consultez les codes d'état et d'erreur pour JSON et XML.
Idempotence
Une requête est dite idempotente si elle peut être effectuée à plusieurs reprises et toujours laisser la ressource qu'elle cible dans le même état final. Par exemple, une requête visant à répertorier des éléments est toujours idempotente, car ces requêtes ne modifient pas les ressources. En revanche, la création d'une notification Pub/Sub n'est jamais idempotente, car elle crée un ID de notification chaque fois que la requête aboutit.
Voici des exemples de conditions qui rendent une opération idempotente :
L'opération a le même effet observable sur la ressource ciblée, même lorsqu'elle des requêtes y sont constamment envoyées.
L'opération ne peut aboutir qu'une seule fois.
Cette opération n'a aucun effet observable sur l'état de la ressource ciblée.
Lorsque vous recevez une réponse permettant une nouvelle tentative, vous devez tenir compte de l'idempotence de la requête, car la répétition de requêtes non idempotentes peut entraîner des conditions de concurrence et d'autres conflits.
Idempotence conditionnelle
Un sous-ensemble de requêtes est idempotent sous conditions, ce qui signifie que les requêtes ne sont idempotentes que si elles incluent des arguments facultatifs spécifiques. Les opérations soumises à une règle de sécurité doivent être relancées par défaut uniquement si la condition est remplie. Cloud Storage accepte les conditions préalables et les ETag comme conditions pour les requêtes.
Idempotence des opérations
Le tableau suivant répertorie les opérations Cloud Storage qui entrent dans chaque catégorie d'idempotence.
Idempotence | Opérations |
---|---|
Toujours idempotente |
|
Idempotente sous conditions |
|
Jamais idempotente |
|
1 Ce champ est exploitable dans l'API JSON. Pour connaître les champs disponibles dans les bibliothèques clientes, consultez la documentation de la bibliothèque cliente correspondante.
Comment les outils Cloud Storage mettent en œuvre des stratégies de nouvelle tentative
Console
La console Google Cloud envoie des requêtes à Cloud Storage en votre nom et gère tout intervalle nécessaire entre les tentatives.
Ligne de commande
Les commandes gcloud storage
relancent les erreurs répertoriées dans la section Réponse sans effectuer d'action supplémentaire.
Vous devrez peut-être prendre des mesures pour d'autres erreurs, par exemple celles ci-dessous :
Identifiants incorrects ou autorisations insuffisantes
Réseau inaccessible en raison d'un problème de configuration du proxy
Pour les erreurs permettant des nouvelles tentatives, la gcloud CLI relance les requêtes à l'aide d'une stratégie d'intervalle exponentiel tronqué entre les tentatives. Le nombre maximal de tentatives par défaut est de 32 pour la gcloud CLI.
Bibliothèques clientes
C++
Par défaut, les opérations autorisent les nouvelles tentatives pour les codes d'erreur HTTP suivants, ainsi que pour les erreurs de socket indiquant que la connexion a été perdue ou n'a jamais été établie.
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tous les paramètres de la bibliothèque C++ concernant l'intervalle exponentiel entre les tentatives et les nouvelles tentatives sont configurables. Si les algorithmes mis en œuvre dans la bibliothèque ne répondent pas à vos besoins, vous pouvez fournir un code personnalisé pour mettre en œuvre vos propres stratégies.
Paramètre | Valeur par défaut |
---|---|
Réessayer automatiquement | Vrai |
Durée maximale de nouvelle tentative d'exécution d'une requête | 15 minutes |
Délai d'attente initial (intervalle entre les tentatives) | 1 seconde |
Multiplicateur de la durée d'attente par itération | 2 |
Durée d'attente maximale | 5 minutes |
Par défaut, la bibliothèque C++ relance toutes les opérations comportant des erreurs récupérables, même celles qui ne sont jamais idempotentes et sont susceptibles de supprimer ou créer plusieurs ressources lorsqu'elles sont répétées plusieurs fois avec succès. Pour ne relancer que les opérations idempotentes, utilisez la classe google::cloud::storage::StrictIdempotencyPolicy
.
C#
Par défaut, la bibliothèque cliente C# utilise un intervalle exponentiel entre les tentatives.
Go
Par défaut, les opérations sont compatibles avec les nouvelles tentatives pour les erreurs suivantes :
- Erreurs de connexion :
io.ErrUnexpectedEOF
: cette erreur peut survenir en raison de problèmes réseau temporaires.url.Error
contenantconnection refused
: cette erreur peut survenir en raison de problèmes réseau temporaires.url.Error
contenantconnection reset by peer
: cette erreur signifie que Google Cloud a réinitialisé la connexion.net.ErrClosed
: cette erreur signifie que Google Cloud a fermé la connexion.
- Codes HTTP :
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
- Erreurs qui mettent en œuvre l'interface
Temporary()
et renvoient la valeurerr.Temporary() == true
- Toutes les erreurs ci-dessus qui ont été encapsulées à l'aide de l'encapsulation d'erreur Go 1.13
Tous les paramètres de la bibliothèque Go concernant l'intervalle exponentiel entre les tentatives sont configurables. Par défaut, les opérations en Go utilisent les paramètres suivants d'intervalle exponentiel entre les tentatives (les valeurs par défaut proviennent de gax) :
Paramètre | Valeur par défaut (en secondes) |
---|---|
Réessayer automatiquement | True si idempotent |
Nombre maximal de tentatives | Aucune limite |
Délai initial avant une nouvelle tentative | 1 seconde |
Multiplicateur de délai avant une nouvelle tentative | 2.0 |
Délai maximal avant une nouvelle tentative | 30 seconds |
Délai avant expiration total (fragment d'importation avec reprise) | 32 secondes |
Délai avant expiration total (toutes les autres opérations) | Aucune limite |
La répétition des tentatives se poursuit indéfiniment, sauf si le contexte de contrôle est annulé, si le client est fermé ou si une erreur non temporaire est reçue. Pour empêcher la répétition des tentatives, utilisez des délais d'expiration de contexte ou une annulation. La seule exception à ce comportement se produit lors de l'exécution d'importations avec reprise à l'aide de Writer, où les données sont suffisamment volumineuses pour nécessiter plusieurs requêtes. Dans ce scénario, chaque fragment expire et cesse d'effectuer de nouvelles tentatives après 32 secondes par défaut. Vous pouvez ajuster le délai avant expiration par défaut en modifiant Writer.ChunkRetryDeadline
.
Il existe un sous-ensemble d'opérations Go idempotentes sous conditions (sous conditions, elles peuvent être relancées en toute sécurité). Ces opérations n'effectuent de nouvelles tentatives que si elles répondent à des conditions spécifiques :
GenerationMatch
ouGeneration
- Tentatives relancées en toute sécurité si une condition préalable
GenerationMatch
a été appliquée à l'appel ou siObjectHandle.Generation
a été défini.
- Tentatives relancées en toute sécurité si une condition préalable
MetagenerationMatch
- Tentatives relancées en toute sécurité si une condition préalable
MetagenerationMatch
a été appliquée à l'appel.
- Tentatives relancées en toute sécurité si une condition préalable
Etag
- Vous pouvez effectuer de nouvelles tentatives si la méthode insère un
etag
dans le corps de la requête JSON. Utilisé uniquement dansHMACKeyHandle.Update
lorsqueHmacKeyMetadata.Etag
a été défini.
- Vous pouvez effectuer de nouvelles tentatives si la méthode insère un
RetryPolicy
est défini par défaut sur RetryPolicy.RetryIdempotent
. Consultez la section Personnaliser les nouvelles tentatives pour obtenir des exemples montrant comment modifier le comportement des nouvelles tentatives par défaut.
Java
Par défaut, les opérations sont compatibles avec les nouvelles tentatives pour les erreurs suivantes :
- Erreurs de connexion :
Connection reset by peer
: cette erreur signifie que Google Cloud a réinitialisé la connexion.Unexpected connection closure
: cette erreur signifie que Google Cloud a fermé la connexion.
- Codes HTTP :
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tous les paramètres de la bibliothèque Java concernant l'intervalle exponentiel entre les tentatives sont configurables. Par défaut, les opérations via Java utilisent les paramètres suivants pour un intervalle exponentiel entre les tentatives :
Paramètre | Valeur par défaut (en secondes) |
---|---|
Réessayer automatiquement | True si idempotent |
Nombre maximal de tentatives | 6 |
Délai initial avant une nouvelle tentative | 1 seconde |
Multiplicateur de délai avant une nouvelle tentative | 2.0 |
Délai maximal avant une nouvelle tentative | 32 secondes |
Délai avant expiration total | 50 secondes |
Délai RPC avant expiration initial | 50 secondes |
Multiplicateur de délai RPC avant expiration | 1.0 |
Délai RPC avant expiration maximal | 50 secondes |
Délai de connexion expiré | 20 secondes |
Délai avant expiration de la lecture | 20 secondes |
Pour en savoir plus sur les paramètres, consultez la documentation de référence Java pour RetrySettings.Builder
et HttpTransportOptions.Builder
.
Il existe un sous-ensemble d'opérations Java idempotentes sous conditions (sous conditions, elles peuvent être relancées en toute sécurité). Ces opérations n'effectuent de nouvelles tentatives que si elles incluent des arguments spécifiques :
ifGenerationMatch
ougeneration
- Vous pouvez effectuer de nouvelles tentatives si
ifGenerationMatch
ougeneration
a été transmis en tant qu'option à la méthode.
- Vous pouvez effectuer de nouvelles tentatives si
ifMetagenerationMatch
- Peut être relancée en toute sécurité si le paramètre
ifMetagenerationMatch
a été transmis en tant qu'option.
- Peut être relancée en toute sécurité si le paramètre
StorageOptions.setStorageRetryStrategy
est défini par défaut sur StorageRetryStrategy#getDefaultStorageRetryStrategy
.
Consultez la section Personnaliser les nouvelles tentatives pour obtenir des exemples montrant comment modifier le comportement des nouvelles tentatives par défaut.
Node.js
Par défaut, les opérations sont compatibles avec les nouvelles tentatives pour les codes d'erreur suivants :
- Erreurs de connexion :
EAI_again
: erreur de résolution DNS. Pour en savoir plus, reportez-vous à la documentation sur le paramètregetaddrinfo
.Connection reset by peer
: cette erreur signifie que Google Cloud a réinitialisé la connexion.Unexpected connection closure
: cette erreur signifie que Google Cloud a fermé la connexion.
- Codes HTTP :
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Tous les paramètres de la bibliothèque Node.js concernant l'intervalle exponentiel entre les tentatives sont configurables. Par défaut, les opérations via Node.js utilisent les paramètres suivants pour un intervalle exponentiel entre les tentatives :
Paramètre | Valeur par défaut (en secondes) |
---|---|
Réessayer automatiquement | True si idempotent |
Nombre maximal de nouvelles tentatives | 3 |
Durée d'attente initiale | 1 seconde |
Multiplicateur de la durée d'attente par itération | 2 |
Durée d'attente maximale | 64 secondes |
Durée par défaut | 600 secondes |
Il existe un sous-ensemble d'opérations Node.js idempotentes sous conditions (sous conditions, elles peuvent être relancées en toute sécurité). Ces opérations n'effectuent de nouvelles tentatives que si elles incluent des arguments spécifiques :
ifGenerationMatch
ougeneration
- Vous pouvez effectuer de nouvelles tentatives si
ifGenerationMatch
ougeneration
a été transmis en tant qu'option à la méthode. Les méthodes n'acceptent souvent que l'un de ces deux paramètres.
- Vous pouvez effectuer de nouvelles tentatives si
ifMetagenerationMatch
- Peut être relancée en toute sécurité si le paramètre
ifMetagenerationMatch
a été transmis en tant qu'option.
- Peut être relancée en toute sécurité si le paramètre
retryOptions.idempotencyStrategy
est défini par défaut sur IdempotencyStrategy.RetryConditional
. Consultez la section Personnaliser les nouvelles tentatives pour obtenir des exemples montrant comment modifier le comportement des nouvelles tentatives par défaut.
PHP
Par défaut, la bibliothèque cliente PHP utilise l'intervalle exponentiel entre les tentatives.
Python
Par défaut, les opérations sont compatibles avec les nouvelles tentatives pour les codes d'erreur suivants :
- Erreurs de connexion :
requests.exceptions.ConnectionError
requests.exceptions.ChunkedEncodingError
(uniquement pour les opérations de récupération ou d'envoi de données de charge utile à des objets, telles que les importations et les téléchargements)ConnectionError
- Codes HTTP :
408 Request Timeout
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
Les opérations via Python utilisent les paramètres par défaut suivants pour l'intervalle exponentiel entre les tentatives :
Paramètre | Valeur par défaut (en secondes) |
---|---|
Réessayer automatiquement | True si idempotent |
Durée d'attente initiale | 1 |
Multiplicateur de la durée d'attente par itération | 2 |
Durée d'attente maximale | 60 |
Durée par défaut | 120 |
Il existe un sous-ensemble d'opérations Python idempotentes sous conditions (sous conditions, elles peuvent être relancées en toute sécurité). Ces opérations n'effectuent de nouvelles tentatives que si une condition est satisfaite :
DEFAULT_RETRY_IF_GENERATION_SPECIFIED
- Vous pouvez effectuer de nouvelles tentatives si
generation
ouif_generation_match
a été transmis en tant qu'argument à la méthode. Les méthodes n'acceptent souvent que l'un de ces deux paramètres.
- Vous pouvez effectuer de nouvelles tentatives si
DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
- Vous pouvez effectuer de nouvelles tentatives si
if_metageneration_match
a été transmis en tant qu'argument à la méthode.
- Vous pouvez effectuer de nouvelles tentatives si
DEFAULT_RETRY_IF_ETAG_IN_JSON
- Vous pouvez effectuer de nouvelles tentatives si la méthode insère un
etag
dans le corps de la requête JSON. PourHMACKeyMetadata.update()
, cela signifie que l'eTag doit être défini sur l'objetHMACKeyMetadata
lui-même. Pour la méthodeset_iam_policy()
sur d'autres classes, cela signifie que l'eTag doit être défini dans l'argument "policy" transmis à la méthode.
- Vous pouvez effectuer de nouvelles tentatives si la méthode insère un
Ruby
Par défaut, les opérations sont compatibles avec les nouvelles tentatives pour les codes d'erreur suivants :
- Erreurs de connexion :
SocketError
HTTPClient::TimeoutError
Errno::ECONNREFUSED
HTTPClient::KeepAliveDisconnected
- Codes HTTP :
408 Request Timeout
429 Too Many Requests
5xx Server Error
Tous les paramètres de la bibliothèque cliente Ruby concernant l'intervalle exponentiel entre les tentatives sont configurables. Par défaut, les opérations via la bibliothèque cliente Ruby utilisent les paramètres suivants pour un intervalle exponentiel entre les tentatives :
Paramètre | Valeur par défaut |
---|---|
Réessayer automatiquement | Vrai |
Nombre maximal de nouvelles tentatives | 3 |
Durée d'attente initiale | 1 seconde |
Multiplicateur de la durée d'attente par itération | 2 |
Durée d'attente maximale | 60 secondes |
Durée par défaut | 900 secondes |
Il existe un sous-ensemble d'opérations Ruby idempotentes sous conditions (sous conditions, elles peuvent être relancées en toute sécurité).
if_generation_match
ougeneration
- Vous pouvez effectuer de nouvelles tentatives si le paramètre
generation
ouif_generation_match
est transmis en tant qu'argument à la méthode. Les méthodes n'acceptent souvent que l'un de ces deux paramètres.
- Vous pouvez effectuer de nouvelles tentatives si le paramètre
if_metageneration_match
- Vous pouvez effectuer de nouvelles tentatives si le paramètre
if_metageneration_match
est transmis en tant qu'option.
- Vous pouvez effectuer de nouvelles tentatives si le paramètre
Par défaut, toutes les opérations idempotentes font l'objet d'une nouvelle tentative et les opérations idempotentes conditionnelles ne sont relancées que si la condition est remplie. Les opérations non idempotentes ne font pas l'objet de nouvelles tentatives. Consultez la section Personnaliser les nouvelles tentatives pour obtenir des exemples montrant comment modifier le comportement des nouvelles tentatives par défaut.
API REST
Lorsque vous appelez directement l'API JSON ou XML, vous devez utiliser l'algorithme d'intervalle exponentiel entre les tentatives pour mettre en œuvre votre propre stratégie de nouvelles tentatives.
Personnaliser les nouvelles tentatives
Console
La console Google Cloud ne vous permet pas de personnaliser le comportement des nouvelles tentatives.
Ligne de commande
Pour les commandes gcloud storage
, vous pouvez contrôler la stratégie de nouvelle tentative en créant une configuration nommée et en définissant tout ou partie des propriétés suivantes :
base_retry_delay
exponential_sleep_multiplier
max_retries
max_retry_delay
Appliquez ensuite la configuration définie soit par commande à l'aide de l'option --configuration
à l'échelle du projet, soit pour toutes les commandes gcloud à l'aide de la commande gcloud config set
.
Bibliothèques clientes
C++
Pour personnaliser le comportement des nouvelles tentatives, fournissez des valeurs pour les options suivantes lorsque vous initialisez l'objet google::cloud::storage::Client
:
google::cloud::storage::RetryPolicyOption
: la bibliothèque fournit les classesgoogle::cloud::storage::LimitedErrorCountRetryPolicy
etgoogle::cloud::storage::LimitedTimeRetryPolicy
. Vous pouvez fournir votre propre classe, qui doit mettre en œuvre l'interfacegoogle::cloud::RetryPolicy
.google::cloud::storage::BackoffPolicyOption
: la bibliothèque fournit la classegoogle::cloud::storage::ExponentialBackoffPolicy
. Vous pouvez fournir votre propre classe, qui doit mettre en œuvre l'interfacegoogle::cloud::storage::BackoffPolicy
.google::cloud::storage::IdempotencyPolicyOption
: la bibliothèque fournit les classesgoogle::cloud::storage::StrictIdempotencyPolicy
etgoogle::cloud::storage::AlwaysRetryIdempotencyPolicy
. Vous pouvez fournir votre propre classe, qui doit mettre en œuvre l'interfacegoogle::cloud::storage::IdempotencyPolicy
.
Pour en savoir plus, consultez la documentation de référence sur la bibliothèque cliente C++.
C#
Vous ne pouvez pas personnaliser la stratégie de nouvelle tentative par défaut utilisée par la bibliothèque cliente C#.
Go
Lorsque vous initialisez un client de stockage, une configuration par défaut des nouvelles tentatives est définie. Les options de la configuration sont définies sur les valeurs par défaut, sauf si elles sont remplacées. Les utilisateurs peuvent configurer un comportement des nouvelles tentatives autre que celui par défaut, soit pour un seul appel de bibliothèque (à l'aide de BucketHandle.Retryer et ObjectHandle.Retryer), soit pour l'ensemble des appels effectués par un client (à l'aide de Client.SetRetry). Pour modifier le comportement des nouvelles tentatives, transmettez l'option RetryOptions souhaitée à l'une de ces méthodes.
Consultez l'exemple de code suivant pour découvrir comment personnaliser le comportement des nouvelles tentatives.
Java
Lorsque vous initialisez Storage
, une instance de RetrySettings
est également initialisée. Sauf si elles sont remplacées, les options de RetrySettings
sont définies sur les valeurs par défaut. Pour modifier le comportement par défaut des nouvelles tentatives automatiques, transmettez l'option personnalisée StorageRetryStrategy
à l'option StorageOptions
utilisée pour créer l'instance Storage
. Pour modifier l'un des autres paramètres scalaires, transmettez une option personnalisée RetrySettings
personnaliséà l'option StorageOptions
utilisée pour créer l'instance Storage
.
Consultez l'exemple suivant pour découvrir comment personnaliser le comportement des nouvelles tentatives :
Node.js
Lorsque vous initialisez Cloud Storage, un fichier de configuration retryOptions est également initialisé. Les options de la configuration sont définies sur les valeurs par défaut, sauf si elles sont remplacées. Pour modifier le comportement par défaut des nouvelles tentatives, transmettez la configuration de nouvelle tentative personnalisée retryOptions
au constructeur de stockage lors de l'initialisation.
La bibliothèque cliente Node.js peut utiliser automatiquement des stratégies d'intervalle exponentiel entre les tentatives pour relancer des requêtes avec le paramètre autoRetry
.
Consultez l'exemple de code suivant pour découvrir comment personnaliser le comportement des nouvelles tentatives.
PHP
Vous ne pouvez pas personnaliser la stratégie de nouvelle tentative par défaut utilisée par la bibliothèque cliente PHP.
Python
Pour modifier le comportement de nouvelle tentative par défaut, créez une copie de l'objet google.cloud.storage.retry.DEFAULT_RETRY
en l'appelant avec une méthode with_XXX
. La bibliothèque cliente Python utilise automatiquement des stratégies d'intervalle exponentiel entre les tentatives pour relancer des requêtes si vous incluez le paramètre DEFAULT_RETRY
.
Notez que with_predicate
n'est pas compatible avec les opérations de récupération ou d'envoi de données de charge utile à des objets, telles que les importations et les téléchargements. Nous vous recommandons de modifier les attributs un par un. Pour en savoir plus, consultez la documentation de référence sur google-api-core Retry.
Pour configurer votre propre nouvelle tentative conditionnelle, créez un objet ConditionalRetryPolicy
et encapsulez votre objet Retry
personnalisé avec DEFAULT_RETRY_IF_GENERATION_SPECIFIED
, DEFAULT_RETRY_IF_METAGENERATION_SPECIFIED
, ou DEFAULT_RETRY_IF_ETAG_IN_JSON
.
Consultez l'exemple de code suivant pour découvrir comment personnaliser le comportement des nouvelles tentatives.
Ruby
Lorsque vous initialisez le client de stockage, toutes les configurations de nouvelles tentatives sont définies selon les valeurs indiquées dans le tableau ci-dessus. Pour modifier le comportement des nouvelles tentatives par défaut, transmettez les configurations de nouvelles tentatives lors de l'initialisation du client de stockage.
Pour forcer le nombre de tentatives pour une opération particulière, transmettez retries
dans le paramètre options
de l'opération.
API REST
Utilisez l'algorithme d'intervalle exponentiel entre les tentatives pour mettre en œuvre votre propre stratégie de nouvelles tentatives.
Algorithme de l'intervalle exponentiel entre les tentatives
Un algorithme d'intervalle exponentiel entre les tentatives relance les requêtes de manière exponentielle, en augmentant le temps d'attente entre les tentatives jusqu'à ce que la durée maximale de l'intervalle exponentiel soit atteinte. Vous devez généralement utiliser un intervalle exponentiel avec gigue pour relancer les requêtes qui répondent à la fois aux critères de réponse et d'idempotence. Pour connaître les bonnes pratiques d'implémentation de nouvelles tentatives automatiques avec un intervalle exponentiel entre les tentatives, consultez la section Gérer les défaillances en cascade.
Étapes suivantes
- Découvrez comment relancer des requêtes dans le service de transfert de stockage avec Java ou Python.
- En savoir plus sur les conditions préalables de requête.