Timeout, retry, outbox : choisir une protection adaptée à la panne
Un service ralentit ou un message revient en double : timeout, retry, outbox et idempotence répondent à des risques différents. Voici comment les combiner.
Article
Un paiement sans réponse peut avoir réussi. L’idempotence permet de réessayer sans double débit, à condition de reconnaître la demande et garder son résultat.
Vous cliquez sur « Payer », mais la page reste en attente. Le paiement a peut-être échoué ; il a peut-être aussi réussi sans que la réponse vous parvienne. Réessayer ne doit pas débiter votre compte une seconde fois. L'idempotence sert à cela : répéter une même opération sans multiplier son effet sur les données.
Régler un thermostat sur 20 °C plusieurs fois conserve la même consigne. Lui demander d'augmenter de 2 °C plusieurs fois augmente la température à chaque demande. La première opération est idempotente, la seconde ne l'est pas.
En informatique, la distinction est la même. Répéter « le statut de la commande est payé » laisse le même statut. Répéter « retirer 10 euros du compte » retire de nouveau de l'argent.
| Demande | Après une exécution | Après deux exécutions identiques |
|---|---|---|
| Fixer une valeur à 100 | La valeur vaut 100 | Elle vaut toujours 100 |
| Ajouter 10 à une valeur initialement à 100 | La valeur vaut 110 | Elle vaut 120 |
| Marquer une commande comme payée | Le statut est « payée » | Le statut reste « payée » |
Il faut regarder l'effet complet de l'opération. Si chaque changement de statut déclenche aussi un courriel, répéter l'enregistrement peut laisser le même statut tout en envoyant deux messages. Le traitement de notification doit lui aussi prévoir les doublons.
Un paiement traverse plusieurs étapes : le client envoie la demande, le serveur l'exécute, puis le serveur répond. Une coupure après l'exécution mais avant la réception de la réponse laisse le client sans confirmation.
La nouvelle tentative peut alors répéter une opération déjà réussie. Un système de messages peut rencontrer le même problème : si le destinataire a traité le message mais n'a pas confirmé sa réception, le système le lui remet.
Pat Helland décrit ce rôle de l'idempotence dans les systèmes distribués. Prévoir les doublons permet de relancer un traitement après un incident sans demander au client de deviner ce qui s'est passé.
Pour protéger un débit, le client crée un identifiant unique avant le premier envoi. Il conserve cet identifiant lorsqu'il réessaie. C'est la clé d'idempotence : elle désigne une seule demande de paiement, même si plusieurs messages la transportent.
Dans une API HTTP qui prévoit ce mécanisme, elle peut être transmise sous cette forme :
Idempotency-Key: paiement-7f3a
Le serveur associe la clé à la demande et à son résultat. Son comportement dépend de l'état du premier traitement :
La vérification de la clé doit résister à deux arrivées simultanées. Un simple « vérifier, puis débiter » ne suffit pas si deux traitements peuvent tous deux constater que la clé est inconnue. L'enregistrement doit empêcher ce cas, par exemple avec une contrainte d'unicité et une transaction adaptée.
Autre point à prévoir : une panne entre le débit et l'enregistrement du résultat. Si le paiement passe par un prestataire externe, la protection doit aller jusqu'à ce prestataire ou permettre de retrouver le paiement effectué. Une clé enregistrée uniquement dans le navigateur ne donne pas cette garantie.
La même clé doit toujours désigner la même demande. Si le client la réutilise avec un autre montant ou un autre destinataire, le serveur doit signaler l'incohérence. Accepter le nouveau contenu rendrait le résultat ambigu.
Le serveur doit aussi annoncer combien de temps il conserve les clés. Une fois une clé supprimée, il peut considérer une nouvelle tentative comme une nouvelle demande. Le client ne peut donc pas supposer qu'une clé protège indéfiniment.
Stripe documente ces règles pour son API : comparaison des paramètres, conservation d'au moins vingt-quatre heures avant suppression possible, puis nouveau traitement si une clé supprimée est réutilisée. Ce sont les garanties de cette API, à vérifier séparément chez chaque fournisseur.
Je conseille de tester les cas qui ressemblent à un incident réel : deux envois simultanés, une réponse perdue, un contenu modifié avec la même clé et une tentative après expiration. Ils révèlent davantage que deux appels bien espacés.
La RFC 9110 définit comme idempotentes les méthodes PUT, DELETE et les méthodes dites sûres, dont GET. Le serveur doit respecter cette sémantique. POST ne bénéficie pas de cette garantie générale.
Une opération POST peut néanmoins proposer une clé d'idempotence, comme les paiements évoqués ici. Le client s'appuie alors sur le contrat particulier de l'API. Le document IETF consacré à cet en-tête décrit cette pratique ; il faut distinguer un projet de spécification d'une norme publiée.
Une réponse HTTP identique n'est pas nécessaire pour qu'une méthode soit idempotente. Une première suppression peut réussir, puis une seconde répondre que la ressource n'existe plus. L'effet demandé reste le même : la ressource est supprimée.
Supposons que deux messages demandent successivement de fixer un prix à 100 euros puis à 120 euros. Chacun peut être idempotent. S'ils arrivent dans l'ordre inverse, le prix final devient pourtant 100 euros.
La clé empêche de traiter deux fois le même message ; elle ne rétablit pas leur ordre. Un numéro de version ou un mécanisme d'ordonnancement reste nécessaire lorsque l'ordre change le résultat métier.
Explorer
Choisis dans l’index d’après les étiquettes de cet article — les plus proches d’abord, hors de sa série. Rien n’est écrit à la main : un article publié demain avec les mêmes étiquettes y prendra place.
Un service ralentit ou un message revient en double : timeout, retry, outbox et idempotence répondent à des risques différents. Voici comment les combiner.
Une réponse perdue ne signifie pas que l’opération a échoué. Méthodes HTTP, clés d’idempotence et suivi du résultat aident à réessayer sans créer de doublon.
Les études sur les citations par les IA donnent des résultats variables. Comprenez ce qu’elles mesurent avant de transformer leurs observations en recettes.
Laisser un commentaire
Votre commentaire sera relu avant d'être publié.