Pourquoi les retries webhook causent des doublons
Comprendre si les doublons viennent de nouvelles tentatives webhook, d’événements distincts ou d’un traitement en aval défaillant.

Pourquoi les nouvelles tentatives de webhook provoquent-elles des messages en double ?
Les nouvelles tentatives de webhook sont utiles… jusqu’à ce qu’elles ne le soient plus. Un seul délai d’attente manqué peut en devenir deux messages, puis trois, et soudain la même mise à jour de commande, réinitialisation de mot de passe ou notification d’expédition apparaît plusieurs fois. C’est là que la question « pourquoi les nouvelles tentatives de webhook provoquent-elles des messages en double » cesse d’être théorique et commence à faire perdre du temps, car elle touche directement les doublons webhook nouvelles tentatives.
La première erreur consiste à supposer que chaque message répété signifie que l’expéditeur est défaillant. Parfois, l’expéditeur a relancé exactement comme prévu. Parfois, votre récepteur a répondu trop lentement. Parfois, une file d’attente, un worker ou une relecture de logs a créé la copie supplémentaire après l’arrivée initiale du webhook. Ce sont des problèmes différents, qui demandent des corrections différentes, notamment pour identifier une retry webhook ou un événement en double.
Ces doublons viennent-ils de nouvelles tentatives ou d’événements webhook distincts ?
Commencez par le test le plus simple : comparez les charges utiles. Si deux livraisons partagent le même ID d’événement, le même ID de livraison ou les mêmes métadonnées de signature, vous avez probablement affaire à un seul événement livré plusieurs fois. Si les données métier se ressemblent mais que les IDs diffèrent, l’expéditeur a peut-être créé deux vrais événements, comme deux actions de paiement ou deux changements de statut.
Ne vous fiez pas uniquement à l’horodatage. Deux livraisons à 12 secondes d’intervalle peuvent toujours correspondre au même événement, tandis que deux messages arrivés à la même seconde peuvent être des événements distincts. Une boucle de retry et un vrai doublon peuvent paraître presque identiques dans une boîte de réception, d’où l’importance des IDs plutôt que de l’œil humain pour identifier une retry webhook ou un événement en double.
Il y a ici un indice pratique. Si votre équipe support voit des alertes e-mail en double, mais que vos logs webhook affichent un événement d’origine et une nouvelle tentative avec les mêmes métadonnées de livraison, le problème est probablement lié au transport. Si les logs montrent deux charges utiles distinctes avec des IDs d’événement différents, le doublon vient de l’amont. Cette distinction fait gagner des heures, surtout quand il faut distinguer pourquoi un webhook est reçu deux fois.
Quel comportement de retry l’expéditeur utilise-t-il réellement ?
Les différents fournisseurs gèrent les retries de façons différentes. Certains réessaient automatiquement après un délai d’attente. D’autres permettent à un opérateur de cliquer sur « renvoyer ». D’autres encore redélivrent après un code d’échec temporaire. Quelques-uns font les trois. Si vous ne savez pas lequel est actif, votre recherche de messages en double tournera en rond.
Un renvoi manuel laisse généralement une trace humaine : une action dans le tableau de bord, une note de ticket ou un dossier de support. Les retries automatiques suivent souvent un schéma, avec des intervalles qui s’allongent entre les tentatives. Les politiques de rediffusion côté fournisseur peuvent être plus discrètes, car l’expéditeur peut considérer une erreur réseau, un problème DNS ou une réponse 5xx comme une raison de réessayer sans que personne n’ouvre le tableau de bord.
Demandez par écrit la politique de retry de l’expéditeur. Un fournisseur peut réessayer pendant 24 heures ; un autre s’arrêter après 3 tentatives ; un autre considérer toute réponse autre que 2xx comme un échec. C’est important, car un message qui « se duplique » après 15 minutes peut simplement être la 4e tentative de la même livraison.
Qu’est-ce qui peut donner l’impression qu’une seule livraison webhook est plusieurs messages en aval ?
Le webhook peut être parfaitement correct. La duplication peut se produire ensuite. Une seule livraison peut se propager dans une file d’attente, puis vers deux consommateurs, puis vers une tâche relançable, et enfin vers deux notifications sortantes. Le webhook d’origine n’était qu’un message ; votre système l’a fait passer pour plusieurs.
Cela arrive particulièrement souvent lorsque le gestionnaire écrit dans une file d’attente avant de valider un enregistrement en base, ou lorsque deux workers consomment la même tâche après un délai de visibilité. Un seul webhook devient plusieurs actions en aval parce que l’état interne n’a pas été verrouillé. Le résultat donne l’impression que l’expéditeur a réessayé, alors que la vraie duplication s’est produite dans votre propre pile.
Regardez où se produit le premier effet de bord. L’e-mail a-t-il été envoyé avant l’insertion en base ? La facture a-t-elle été marquée comme payée après le lancement de la tâche de notification ? La tâche a-t-elle été remise en file parce que le worker a planté au mauvais moment ? Ces détails comptent plus que le message d’erreur principal.
Comment les IDs de charge utile et les métadonnées de livraison peuvent-ils révéler la vraie cause ?
Les IDs de charge utile sont votre meilleure preuve. L’ID d’événement, l’ID de livraison, le compteur de tentatives, la signature de la requête et l’horodatage du fournisseur peuvent montrer si un webhook a été rejoué ou si plusieurs événements distincts ont été émis. Si l’expéditeur inclut un compteur de tentatives, un numéro de livraison ou un hachage de requête, enregistrez-les dans les logs et dans votre base de données.
Créez un petit tableau de comparaison si besoin. Trois colonnes suffisent pour un premier diagnostic : l’identifiant de la charge utile, les métadonnées de livraison et l’action métier effectuée. Quand le même ID d’événement apparaît deux fois, mais que votre système n’a agi qu’une seule fois, le retry est peut-être inoffensif. Quand le même ID d’événement apparaît deux fois et que votre système a agi deux fois, vous avez une faille de déduplication.
| Champ | Ce qu’il vous indique | Indice courant |
|---|---|---|
| ID d’événement | Si l’événement webhook est le même | Même ID, livraison répétée |
| ID de livraison | Quelle tentative de transport vous a atteint | IDs de livraison différents, même événement |
| Compteur de tentatives | Combien d’essais l’expéditeur a effectués | Nombre plus élevé après un timeout |
| Signature | Si le corps a changé pendant le transport | Un écart suggère une charge utile altérée |
Les signes d’un vrai doublon sont souvent ennuyeux, ce qui est une bonne chose. Même charge utile, mêmes IDs, même action, livraison répétée. Les signes d’événements distincts sont plus confus : horodatages proches, contenu similaire, mais IDs différents ou enregistrements source différents. C’est la différence entre un problème de retry et un problème produit.
Pourquoi des accusés de réception trop lents déclenchent-ils souvent des livraisons en double ?
La plupart des expéditeurs de webhook attendent une réponse 2xx rapide. Si votre serveur hésite pendant 8 secondes, expire au bout de 10 ou renvoie une réinitialisation de connexion, l’expéditeur peut ne pas savoir si le message a été traité. Il réessaie donc. De son point de vue, réessayer est plus sûr que perdre l’événement.
C’est pourquoi une livraison peut réussir et être tout de même relancée. Le réseau peut tomber en panne après que votre application a déjà écrit l’enregistrement, ou la réponse peut être retardée juste assez pour que l’expéditeur suppose un échec. Une seule réponse tardive suffit. L’expéditeur n’a pas une visibilité parfaite sur votre état interne.
Une requête lente en base suffit à déclencher la chaîne. C’est aussi le cas d’un conteneur froid, d’un thread bloqué ou d’une file d’attente qui retarde le renvoi de succès. Si le point de terminaison webhook fait quoi que ce soit de lourd avant d’accuser réception, les messages en double deviennent plus probables. C’est un problème de transport, pas de contenu.
Si vous voulez un schéma connexe, l’article sur les webhooks d’e-mail pour les e-mails transactionnels traite de la même idée dans la gestion des événements e-mail, où le timing et l’accusé de réception déterminent ce qui est livré ensuite.
Et si votre récepteur a traité l’événement mais a quand même renvoyé un échec ?
C’est un cas particulièrement pénible. Le webhook peut créer la commande, envoyer la notification ou mettre à jour la fiche client, puis lever une exception أثناء la construction de la réponse. L’expéditeur voit un échec. Il réessaie. Votre système a désormais deux effets de bord à partir d’un seul événement, et les logs peuvent diverger sur l’étape qui a échoué en premier.
C’est pourquoi les échecs partiels nécessitent une attention particulière. Un gestionnaire qui enregistre le message puis plante avant de renvoyer un 2xx a peut-être déjà effectué le vrai travail. L’expéditeur, ignorant ce fait, fait ce qu’on lui a demandé de faire. Si vous vous demandez pourquoi les nouvelles tentatives de webhook provoquent des messages en double, c’est l’une des réponses les plus fréquentes.
Vérifiez le chemin de code après l’effet de bord, pas seulement avant. Le gestionnaire a-t-il écrit en base puis échoué sur un appel de métriques ? A-t-il publié dans une file puis expiré au moment du formatage JSON ? A-t-il envoyé un e-mail sortant puis levé une erreur de validation ? De petits échecs peuvent avoir de grands effets de duplication.
Comment empêcher les doublons liés aux retries sans perdre d’événements ?
L’idempotence est la réponse pratique. Stockez une clé unique pour chaque événement et rejetez les répétitions avant qu’elles ne déclenchent une seconde action. Cette clé peut être l’ID d’événement, un ID de livraison du fournisseur ou une combinaison de la source et d’un hachage du message. L’important est que le même webhook corresponde au même résultat stocké.
Effectuez la vérification de déduplication et l’écriture dans une seule étape atomique si possible. Si la vérification se fait d’abord et l’insertion ensuite, deux workers peuvent entrer en concurrence et penser tous les deux être les premiers. Une contrainte d’unicité en base est souvent plus simple qu’un cache mémoire personnalisé, et elle survit aux redémarrages. De petits choix de conception comptent ici.
N’utilisez une fenêtre de déduplication courte que si la politique de retry de l’expéditeur est courte et bien connue. Si le fournisseur réessaie pendant des heures, un cache de 5 minutes ne suffit pas. Si l’événement peut arriver plusieurs jours plus tard, votre stockage de déduplication doit durer plus longtemps que votre souvenir de l’incident.
Pour les équipes qui gèrent à la fois la livraison d’événements et la communication client, le guide de configuration de l’authentification e-mail est un bon complément, car le même état d’esprit s’applique : vérifier l’identité d’abord, agir ensuite, et ne jamais se fier à un seul signal isolé.
Envoyez la réponse 2xx seulement après avoir enregistré l’événement de manière sûre. Cela ne veut pas dire que tout le workflow métier doit être terminé avant l’accusé de réception. Cela signifie que le récepteur doit conserver l’événement dans un emplacement durable, puis le traiter de façon asynchrone. Ainsi, l’expéditeur voit une réussite une seule fois, tandis que votre worker peut réessayer sans réaccepter le même événement.
Quand faut-il rendre visibles les tentatives webhook répétées ?
Journalisez les tentatives répétées dès le premier jour. N’attendez pas le signalement d’un utilisateur. Une simple ligne de log avec l’ID d’événement, l’ID de livraison, le numéro de tentative, le code de réponse et le temps de traitement peut révéler une tempête de retries avant qu’elle ne se propage en e-mails, factures ou SMS. Une alerte au bon moment vaut mieux que dix tickets support plus tard.
Déclenchez une alerte lorsque le même ID d’événement apparaît plusieurs fois dans une courte fenêtre, ou lorsqu’une seule source envoie une hausse soudaine de retries après une mise en production. Cette hausse peut indiquer des timeouts, des certificats expirés, un mauvais déploiement ou une dépendance en aval qui s’est suffisamment ralentie pour déclencher des retries. Plus vous voyez le schéma tôt, moins vous avez de messages en double à nettoyer.
Gardez un œil sur le récepteur et un autre sur l’expéditeur. Si le tableau de bord du fournisseur montre 7 tentatives mais que vos logs d’application n’en montrent que 2, les 5 manquantes sont peut-être des échecs au niveau réseau. Si vos logs d’application montrent 7 événements acceptés pour un seul ID, le problème se trouve dans votre chemin de déduplication. Dans tous les cas, le nombre vous indique où chercher ensuite.
Et si les doublons sont liés à des alertes ou des notifications plutôt qu’aux webhooks seuls, la même discipline s’applique à la messagerie en aval, surtout lorsqu’un second système réagit au premier sans vérifier si le premier message a déjà été traité.
Sur cette page
← Tous les articlesUn clic. Cela nous dit quoi écrire ensuite.
Pas encore d'évaluations — la vôtre serait la première.
Commentaires
Les commentaires sont lus avant d'apparaître.