Idempotence des Webhooks
Sangho garantit une livraison at-least-once : un événement peut être livré plusieurs fois en cas d’échec réseau, de timeout ou de redémarrage de votre serveur. Votre endpoint doit être idempotent — traiter deux fois le même événement ne doit pas produire d’effet de bord supplémentaire.
Stratégie de déduplication
- 1. Extraire le
Sangho-Event-IDdu header (ouevent.iddu body). - 2. Vérifier en base si cet ID a déjà été traité.
- 3. Si oui → retourner
200immédiatement sans retraiter. - 4. Si non → traiter l'événement, puis enregistrer l'ID.
N’utilisez pas un Set en mémoire en production — il se
réinitialise au redémarrage du serveur. Utilisez une table SQL avec une contrainte
PRIMARY KEY sur l’event_id, ou
Redis avec SET NX (SET if Not eXists).
En PostgreSQL et SQLite, utilisez INSERT … ON CONFLICT (event_id) DO NOTHING
pour une déduplication atomique sans race condition, même sous charge concurrente.
Déduplication (Node.js)
Modèle SQL de déduplication
Créez une table dédiée pour stocker les IDs d’événements déjà traités. La contrainte
PRIMARY KEY sur event_id garantit
l’unicité au niveau base de données, même en cas de requêtes concurrentes.
Ajoutez un index sur processed_at pour faciliter le
nettoyage périodique des anciens enregistrements (après 30 jours par exemple).
Sangho ne relivrera jamais un événement après 48 heures. Vous pouvez supprimer les enregistrements de déduplication de plus de 72 heures sans risque. Planifiez un job de nettoyage via Celery Beat, cron, ou une tâche planifiée.