View a markdown version of this page

Comportement de nouvelle tentative - AWS SDK et outils

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Comportement de nouvelle tentative

Important

Le comportement décrit sur cette page nécessite une activation jusqu'à ce qu'il devienne le comportement par défaut. AWS_NEW_RETRIES_2026=trueInstallez-le dans votre environnement. Sans ce paramètre, votre SDK utilise le comportement des nouvelles tentatives antérieur à 2026, qui diffère en termes de temps d'attente, de coûts de quota de nouvelles tentatives et de valeurs par défaut spécifiques au service. Pour plus de détails, consultez le billet de blog consacré à l'annonce.

Lorsqu'une demande Service AWS échoue en raison d'une erreur transitoire ou d'un ralentissement, le SDK peut automatiquement réessayer la demande. Cette page explique comment configurer les nouvelles tentatives et comment elles fonctionnent en interne.

Configuration des nouvelles tentatives

Vous contrôlez la stratégie de nouvelles tentatives utilisée par le SDK et le nombre de nouvelles tentatives.

Choix d'un mode de nouvelle tentative

Le mode nouvelle tentative détermine le comportement du SDK en cas d'échec d'une demande. Trois modes sont disponibles : standard, adaptatif et traditionnel.

Standard Adaptatif Héritée
Quota de nouvelles tentatives Oui Oui Varie selon le SDK
Peut retarder la demande initiale Non Oui Non
Error-type-specific reculer Oui Oui Varie selon le SDK
Standardisé pour tous les SDK Oui Oui Non
Recommendation Par défaut pour toutes les charges de travail Single-resource, puissant en termes d'étranglement, tolérant à la latence Rétrocompatibilité uniquement

Mode standard (par défaut)

Le mode standard réessaie les demandes qui ont échoué en utilisant un retard exponentiel avec gigue. Il utilise des délais plus courts pour les erreurs transitoires (telles que les délais d'attente du réseau) et des délais plus longs pour les erreurs de régulation (telles que). ThrottlingException

Le mode standard inclut un quota de nouvelles tentatives, un bucket de jetons qui déduit les jetons à chaque nouvelle tentative et réapprovisionne les jetons lorsque les demandes aboutissent. Lorsque les jetons disponibles sont épuisés, le SDK renvoie l'erreur sans réessayer, de sorte que votre application échoue rapidement au lieu d'attendre des tentatives qui ont peu de chances de réussir. Cela permet également de résoudre plus rapidement les interruptions de service en réduisant le nombre de nouvelles tentatives. Pendant le fonctionnement normal, le quota reste plein et n'a aucun effet. Le quota de nouvelles tentatives ne retarde ni ne bloque jamais la demande initiale. Seules les nouvelles tentatives sont concernées. Pour en savoir plus, consultez Quota de nouvelles tentatives (bucket de jetons).

Utilisez le mode standard sauf si vous avez une raison précise de choisir un autre mode.

Mode adaptatif

Le mode adaptatif inclut tout le mode standard, plus un limiteur de débit côté client. Le limiteur de débit suit les réponses de régulation et ajuste le débit auquel le SDK envoie les demandes. Contrairement au mode standard, le mode adaptatif peut retarder ou bloquer la demande initiale, et pas simplement les nouvelles tentatives, lorsqu'un étranglement est détecté.

Le limiteur de débit fonctionne par instance client du SDK. Toutes les demandes d'un client partagent la même limite de débit, quelle que soit l'opération d'API ou la ressource qu'elles ciblent.

Quand utiliser le mode adaptatif :

  • Votre client cible une seule ressource (par exemple, une table DynamoDB) et vous vous attendez à des réponses de régulation fréquentes. Cela est courant dans les flux de travail automatisés, les processeurs par lots ou les charges de travail basées sur l'IA qui font appel à une seule opération d'API à volume élevé.

  • Vous souhaitez que le SDK ralentisse automatiquement lorsque le service signale une limitation.

Quand ne pas utiliser le mode adaptatif :

  • Votre client envoie des demandes à plusieurs ressources ou dessert plusieurs locataires. La limitation d'une ressource entraîne le ralentissement par le limiteur de débit de toutes les demandes provenant de ce client, y compris les demandes adressées aux ressources non affectées.

  • Vous avez besoin d'une latence prévisible lors de la demande initiale.

Le mode adaptatif n'est pas recommandé par défaut.

Mode Héritage

Le mode Legacy est le comportement de nouvelle tentative utilisé par chaque SDK avant l'introduction du mode standard. Il n'inclut pas de quota de nouvelles tentatives normalisé. Certains SDK (tels que Java) avaient leurs propres implémentations de quotas de nouvelles tentatives en mode ancien, mais le comportement n'est pas uniforme d'un SDK à l'autre. Sans quota standardisé, un client continue de réessayer à plein régime en cas d'interruption de service. Cela bloque les threads et les connexions lorsque les demandes ont peu de chances d'aboutir, tout en ajoutant une charge susceptible de retarder le rétablissement du service.

Le mode Legacy varie selon les SDK. Le nombre de tentatives, le délai d'attente, les ensembles d'erreurs réessayables et le comportement de limitation varient selon les langues. Le code qui dépend du comportement de nouvelle tentative existant peut se comporter différemment lorsqu'il est déplacé entre les SDK.

Disponible en : Java, Python, Ruby, PHP, C++, CLI

Non disponible dans : .NET, Go, Kotlin, Rust, Swift, JavaScript

Le mode Legacy existe pour des raisons de rétrocompatibilité. Si vous utilisez actuellement le mode traditionnel, passez en mode standard.

Réglages de nouvelle tentative

Les paramètres suivants contrôlent le comportement des nouvelles tentatives. Vous pouvez les définir via des variables d'environnement, le fichier de configuration partagé (~/.aws/config) ou la configuration du client dans le code.

Paramètre Ce qu'il contrôle Variable d'environnement Clé du fichier de configuration Par défaut
Mode nouvelle tentative Quelle stratégie de nouvelle tentative utiliser AWS_RETRY_MODE retry_mode standard
Nombre maximum de tentatives Nombre total de tentatives, demande initiale comprise AWS_MAX_ATTEMPTS max_attempts 3(voir notes)

Une valeur maximale de tentatives de 3 signifie que le SDK effectue une demande initiale et jusqu'à deux nouvelles tentatives. Définissez le nombre maximum de tentatives sur 1 pour désactiver complètement les nouvelles tentatives.

Note

Les clients DynamoDB et DynamoDB Streams utilisent par défaut le nombre maximum de tentatives. 4 Ces services utilisent un délai de temporisation de base plus court (25 ms au lieu de 50 ms) pour correspondre à leur profil de faible latence. La tentative supplémentaire permet de maintenir le retard maximal de la dernière tentative comparable à celui des autres services. Vous pouvez le remplacer par les mêmes paramètres que ceux indiqués dans le tableau précédent.

Ordre de priorité de configuration

Lorsque vous spécifiez le même paramètre à plusieurs endroits, le SDK résout la valeur en utilisant la priorité suivante, de la plus élevée à la plus faible :

  1. Configuration client explicite dans le code. Une valeur définie directement sur le client du SDK ou son objet de configuration.

  2. Variable d'environnement. Par exemple, AWS_RETRY_MODE ou AWS_MAX_ATTEMPTS.

  3. Fichier de configuration partagé. Entrez la max_attempts touche retry_mode OR~/.aws/config.

  4. SDK par défaut. La valeur par défaut intégrée pour le paramètre.

Cela suit la priorité de configuration standard du AWS SDK. Une valeur définie à un niveau supérieur remplace toujours une valeur définie à un niveau inférieur. Par exemple, si vous définissez AWS_RETRY_MODE=adaptive en tant que variable d'environnement et retry_mode=standard en tant que variable d'environnement~/.aws/config, le SDK utilise le mode adaptatif.

Language-specific configuration

Les paramètres inter-SDK décrits sur cette page (retry_modeetmax_attempts) fonctionnent dans tous les SDK. Cependant, l'API permettant de configurer les nouvelles tentatives dans le code varie selon la langue. Consultez le guide du développeur de votre SDK pour connaître les options de configuration spécifiques au langage, telles que les stratégies de latence personnalisées, les erreurs supplémentaires susceptibles d'être réessayées et le réglage du quota de nouvelles tentatives.

Comment fonctionnent les nouvelles tentatives

Cette section décrit la manière dont AWS les SDK traitent les demandes ayant échoué : quelles erreurs déclenchent de nouvelles tentatives, combien de temps le SDK attend entre les tentatives et quand il arrête de réessayer.

Que se passe-t-il lorsqu'une demande échoue

Lorsque vous effectuez un appel d'API via un AWS SDK, celui-ci suit la séquence suivante :

  1. Mode adaptatif uniquement : le SDK vérifie le limiteur de débit côté client. Si un étranglement a été détecté, le SDK peut retarder ou bloquer la demande avant de l'envoyer.

  2. Le SDK envoie la demande au point de Service AWS terminaison.

  3. Si le service renvoie une réponse positive, le SDK renvoie le résultat à votre code.

  4. Si la demande échoue, le SDK classe l'erreur comme transitoire, limitée ou non réessayable. Consultez Quelles erreurs sont réessayées.

  5. Si l'erreur ne peut pas être réessayée, le SDK renvoie immédiatement l'erreur à votre code. Aucune nouvelle tentative n'est tentée.

  6. Si l'erreur est réessayable, le SDK vérifie si le nombre maximum de tentatives a été atteint. Si tel est le cas, il renvoie l'erreur à votre code.

  7. Le SDK vérifie le. Quota de nouvelles tentatives (bucket de jetons) Si le budget des jetons est épuisé, le SDK ne réessaie pas et renvoie l'erreur à votre code. Exception : Long-polling opérations car le SDK applique toujours un délai d'attente avant de renvoyer l'erreur.

  8. Le SDK calcule un délai d'attente en fonction du type d'erreur et du nombre de nouvelles tentatives. Consultez Combien de temps le SDK attend-il.

  9. Le SDK attend le délai calculé, puis envoie à nouveau la demande à partir de l'étape 2.

Le SDK répète cette boucle jusqu'à ce que la demande aboutisse, que le nombre maximal de tentatives soit atteint, que le quota de nouvelles tentatives soit épuisé ou qu'une erreur non réessayable se produise. L'ensemble du processus est automatique. Votre application reçoit soit une réponse positive, soit une dernière erreur.

Quelles erreurs sont réessayées

Le SDK classe chaque demande ayant échoué dans l'une des trois catégories suivantes : transitoire, limitée ou non réessayable. Cette classification détermine si le SDK tente à nouveau la demande et combien de temps il attend avant de réessayer.

La classification est basée sur le code d'erreur et le code d'état HTTP figurant dans la réponse du service. Par exemple, un HTTP 400 avec le code d'erreur RequestTimeout est classé comme transitoire et réessayé. Un HTTP 400 avec ValidationException est classé comme non réessayable et renvoyé immédiatement.

Classification des erreurs

Les erreurs transitoires sont réessayées avec un court délai de base (50 ms) :

Code d’erreur
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O Échec (réinitialisation de la connexion, échec de la résolution DNS, délai d'expiration du socket)
(tout HTTP 500, 502, 503 ou 504 sans code d'erreur reconnu)

Les erreurs de régulation sont réessayées avec un délai de base plus long (1 000 ms) :

Code d’erreur
Throttling
ThrottlingException
ThrottledException
RequestThrottledException
TooManyRequestsException
ProvisionedThroughputExceededException
TransactionInProgressException
LimitExceededException
PriorRequestNotComplete
RequestThrottled
EC2ThrottledException
RequestLimitExceeded
SlowDown
BandwidthLimitExceeded

Non-retryable les erreurs (telles queAccessDeniedException,ValidationException,ResourceNotFoundException) sont immédiatement renvoyées à votre code.

Note

Un HTTP 5XX avec un code d'erreur de régulation est classé comme une erreur de régulation et non comme une erreur transitoire, même si les erreurs 5XX sont normalement transitoires. Le SDK correspond d'abord au code d'erreur, puis revient au code d'état HTTP.

Les erreurs de régulation signifient que le service a activement rejeté votre demande en raison de limites de débit. Le SDK attend donc plus longtemps avant de réessayer afin de donner au service le temps de récupérer sa capacité. Consultez Combien de temps le SDK attend-il les délais spécifiques.

Combien de temps le SDK attend-il

Le SDK utilise un ralentissement exponentiel avec une instabilité totale. En moyenne, chaque nouvelle tentative attend plus longtemps que la précédente, et la randomisation permet de répartir les demandes provenant de plusieurs clients.

Retards de base par type d'erreur

Le délai de base varie selon que l'erreur est transitoire ou limitée :

Error type (Type d'erreur) Délai de base Justification
Transitoire (sans étranglement) 50 millisecondes Les erreurs transitoires sont généralement résolues en quelques millisecondes. Un court délai de base permet une reprise rapide.
étranglement 1 000 ms Le service a limité le débit de la demande. Un délai de base plus long donne le temps de récupérer la capacité.

Formule Backoff

Le SDK calcule le délai de chaque nouvelle tentative à l'aide de la formule suivante :

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

Où :

  • random(0, 1)renvoie une valeur uniformément répartie entre 0 et 1

  • base_delayest de 50 ms pour les erreurs transitoires ou de 1 000 ms pour les erreurs de régulation

  • retrycommence à 0 pour la première tentative (la deuxième tentative globale de demande)

La durée maximale d'attente est de 20 secondes. Aucun délai individuel ne dépasse 20 secondes, quel que soit le nombre de tentatives effectuées.

Exemples réussis

Exemple 1 : erreur transitoire, 3 tentatives maximum

Step (Étape) Que se passe-t-il Delay
Tentative 1 Demande initiale. Le service renvoie HTTP 503. (aucun)
Tentative 2 Le SDK attend aléatoirement (0, 50 ms). La nouvelle tentative échoue avec 503. 0 à 50 ms (moyenne ~25 ms)
Tentative 3 Le SDK attend aléatoirement (0, 100 ms). La nouvelle tentative réussit. 0 à 100 ms (moyenne ~50 ms)

La latence ajoutée totale est en moyenne d'environ 75 ms lors des deux tentatives.

Exemple 2 : erreur de limitation, 3 tentatives maximum

Step (Étape) Que se passe-t-il Delay
Tentative 1 Demande initiale. Les retours de service 429Throttling. (aucun)
Tentative 2 Le SDK attend aléatoirement (0, 1 000 ms). Retry renvoie 429. 0 à 1 000 ms (moyenne ~500 ms)
Tentative 3 Le SDK attend aléatoirement (0, 2 000 ms). La nouvelle tentative réussit. 0 à 2 000 ms (moyenne ~1 000 ms)

La latence ajoutée totale est en moyenne d'environ 1 500 ms lors des deux tentatives.

Exemple 3 : erreur transitoire, atteinte du plafond de réduction

Avec un délai de base de 50 ms, le délai calculé avant le plafonnement serait :

Tentative de nouvelle tentative Délai maximal calculé Après un plafond de 20 s
1 50 millisecondes 50 millisecondes
2 100 millisecondes 100 millisecondes
5 800 millisecondes 800 millisecondes
9 12 800 ms 12 800 ms
10 25 600 ms 20 000 ms

Le plafond prend effet à la 10e tentative (11e tentative) pour les erreurs transitoires. Pour les erreurs de régulation avec une base de 1 000 ms, le plafond prend effet à la 6e tentative.

Note

Avec la valeur par défaut de 3 tentatives maximum (1 demande initiale + 2 nouvelles tentatives), le délai maximal n'est jamais atteint. Ce tableau illustre ce qui se passe si vous augmentez max_attempts bien au-delà de la valeur par défaut.

Pourquoi la nervosité est importante

Le multiplicateur aléatoire est appelé full jitter. Sans cela, tous les clients qui rencontraient une erreur en même temps réessaieraient en même temps, ce qui créerait un pic de trafic de nouvelles tentatives (le problème du « tonnerre »). L'instabilité totale répartit les nouvelles tentatives de manière uniforme sur l'ensemble de la fenêtre d'attente, de sorte que le service reçoit un flot constant de demandes au lieu de pics synchronisés.

Supposons, par exemple, que 1 000 clients reçoivent tous un 503 au même moment. Full Jitter répartit leurs premières tentatives de manière uniforme sur une fenêtre de 50 ms au lieu de les faire toutes les 1 000 tentatives exactement à 50 ms.

Server-directed réessayer le chronométrage

Certains Services AWS incluent un x-amz-retry-after en-tête dans les réponses aux erreurs. La valeur de l'en-tête est un délai en millisecondes. Lorsque cet en-tête est présent, le SDK utilise le délai spécifié par le serveur, limité au minimum au délai de temporisation calculé et au maximum au délai de temporisation calculé majoré de 5 000 ms. Le délai calculé étant lui-même plafonné à 20 secondes, le délai maximal effectif dirigé par le serveur est de 25 secondes. Le SDK n'applique pas de gigue à cette valeur, car le service est censé la modifier. Cela permet au service de communiquer exactement au moment où il prévoit disposer de la capacité disponible.

Quota de nouvelles tentatives (bucket de jetons)

Le SDK gère un budget interne de jetons qui permet de suivre le ratio entre les demandes réussies et les échecs. Lorsque les défaillances sont généralisées, le budget s'épuise et le SDK renvoie directement les erreurs. Votre application échoue rapidement au lieu d'attendre de nouvelles tentatives qui ont peu de chances de réussir. Cela réduit également le trafic de nouvelles tentatives, ce qui permet de résoudre plus rapidement les interruptions de service.

Comment fonctionne le quota de nouvelles tentatives

Le budget symbolique commence au point de départ plein. Chaque nouvelle tentative déduit des jetons. Lorsqu'une nouvelle tentative réussit, le SDK restaure les jetons consommés par cette nouvelle tentative. Lorsqu'une demande aboutit au premier essai (aucune nouvelle tentative n'est nécessaire), le SDK restaure 1 jeton. Lorsque le budget atteint zéro, le SDK arrête de réessayer et renvoie les erreurs directement dans votre code.

Paramètre Value
Capacité budgétaire 500 jetons
Coût par nouvelle tentative transitoire (sans limitation) 14 jetons
Coût par nouvelle tentative de limitation 5 jetons
Tokens restaurés en cas de succès après une nouvelle tentative Quantité consommée lors de la dernière tentative (14 ou 5)
Tokens restaurés en cas de succès sans nouvelle tentative 1 jeton

Le coût plus élevé des tentatives transitoires reflète leur schéma d'échec différent. Les erreurs transitoires telles que les 500 et les défaillances de connexion indiquent souvent un problème à l'échelle du service. Dans ces situations, il est peu probable que la poursuite des tentatives aboutisse. Cela augmente la latence de vos appels, bloque les ressources des clients et peut retarder le rétablissement pour tout le monde. Les erreurs de régulation indiquent que le service a besoin de plus de temps avant que la demande puisse aboutir. Le SDK attend plus longtemps entre les tentatives afin d'améliorer les chances de réussite.

Quand le bloc de quotas réessaie-t-il ?

Le quota de nouvelles tentatives permet de suivre les jetons à tout moment, mais ne bloque les nouvelles tentatives que lorsque le budget est épuisé. Pendant le fonctionnement normal, presque toutes les demandes aboutissent et le budget reste plein. Le quota n'a aucun effet observable sur les nouvelles tentatives.

Une nouvelle tentative réussie rétablit uniquement son propre coût en jetons (14 ou 5 jetons), et non le coût des tentatives infructueuses précédentes dans le cadre de la même demande. Par exemple, si la première tentative échoue et que la seconde réussit, le budget perd 14 jetons nets. Le budget s'épuise le plus rapidement lorsque toutes les tentatives sont épuisées sans succès, mais il s'épuise également progressivement lorsque les demandes nécessitent plusieurs tentatives avant d'aboutir.

Avec la valeur par défaut de 3 tentatives maximum, le quota commence à s'épuiser lorsque plus d'environ 22 % des demandes entraînent des échecs transitoires prolongés, ou plus d'environ 32 % en cas d'erreurs de limitation. En dessous de ces taux, les demandes réussies réapprovisionnent le budget plus rapidement que les tentatives infructueuses ne l'épuisent.

Le solde de départ de 500 jetons du budget fournit une marge de manœuvre qui permet d'absorber les défaillances de courte durée. Une brève augmentation du nombre d'erreurs, même grave, ne bloque pas les nouvelles tentatives, sauf si elle persiste suffisamment longtemps pour épuiser la mémoire tampon.

Implications pratiques

  • Faibles taux d'échec : le quota n'a aucun effet. Le budget reste à pleine capacité ou presque.

  • En cas d'interruption de service : si un pourcentage élevé de vos demandes échouent pendant une période prolongée, le quota est épuisé et votre client reçoit immédiatement des erreurs au lieu d'attendre de nouvelles tentatives. Cela réduit la latence côté client, libère des threads et des connexions, et permet au service de se rétablir plus rapidement.

  • Restauration : à mesure que le service se rétablit et que les demandes recommencent à aboutir, les tentatives réussies rétablissent le coût total du jeton et les tentatives réussies au premier essai restaurent 1 jeton. Le budget se recharge progressivement et tente à nouveau de reprendre automatiquement.

  • Champ d'application : le budget des jetons est généralement limité à une seule instance client du SDK. La portée exacte peut varier selon le SDK. Il n'est pas partagé entre les processus ou les hôtes.

Service-specific comportement

DynamoDB

Les clients DynamoDB utilisent des paramètres par défaut optimisés pour le profil de faible latence de DynamoDB :

Paramètre Valeur par défaut générale DynamoDB par défaut
Retard de base transitoire (sans étranglement) 50 millisecondes 25 millisecondes
Atténuation du délai de base 1 000 ms 1 000 ms
Nombre maximum de tentatives 3 4

Ces valeurs par défaut s'appliquent à Amazon DynamoDB et à DynamoDB Streams.

Long-polling opérations

Certaines AWS opérations utilisent de longs sondages. Ils peuvent maintenir une connexion ouverte en attendant l'arrivée des travaux. Ces opérations font l'objet d'un traitement spécial pour les nouvelles tentatives :

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

Comportement spécial : lorsque le quota de nouvelles tentatives est épuisé et que les nouvelles tentatives sont bloquées (étape 7 plus loinQue se passe-t-il lorsqu'une demande échoue), le SDK applique toujours un délai avant de renvoyer l'erreur à votre code.

Cela est important car les longues opérations de sondage sont généralement organisées en boucle étroite. Votre code appelleReceiveMessage, traite tous les messages, puis appelle ReceiveMessage à nouveau immédiatement. Sans ce recul forcé, un budget de jetons épuisé entraînerait le renvoi d'erreurs par le SDK sans délai. Votre boucle de sondage enverra alors immédiatement la demande suivante, ce qui augmentera l'utilisation du processeur du client et générera du trafic supplémentaire. Le délai d'attente forcé met fin à ce cycle, ce qui permet de gérer l'utilisation des ressources des clients et le taux d'interrogation en cas de panne.

Support par AWS Kits SDK et outils

Le tableau suivant indique la disponibilité du comportement de nouvelle tentative mis à jour dans chaque SDK. Pour SDK-specific plus de détails, notamment la version minimale, les valeurs par défaut avant/après et des exemples de code, consultez le GitHub problème de suivi.