Dans Dokos, les webhooks permettent d'envoyer des notifications en temps réel à des services externes lorsque certains événements se produisent (par exemple, la création d'une commande client ou la mise à jour d'une facture). Cependant, il arrive que le service externe soit temporairement indisponible, ce qui entraîne l'échec de la livraison du webhook.
Pour améliorer la fiabilité de ces notifications, Dokos propose désormais un mécanisme de tentatives de renvoi automatiques avec un délai progressif (backoff schedule). Cela signifie que si un webhook échoue, Dokos tentera de le renvoyer plusieurs fois à des intervalles croissants avant d'abandonner définitivement.
Lors des tentatives de renvoi, Dokos rejoue exactement le même payload que celui qui a été envoyé lors de la première tentative. Cela garantit que le service externe reçoit toujours les données dans l'état où elles étaient au moment de l'événement déclencheur, même si le document a été modifié entre-temps.
| Champ | Description |
|---|---|
| Statut | Statut actuel du webhook (Échoué, En attente de renvoi, Épuisé, Livré). |
| Nombre de tentatives | Nombre de tentatives effectuées jusqu'à présent. |
| Prochaine tentative | Date et heure de la prochaine tentative de renvoi (si applicable). |
| Payload | Contenu du webhook tel qu'il a été envoyé lors de la première tentative. |
| Réponse | Réponse reçue du service externe (en cas d'échec). |
Contexte : Vous utilisez un webhook pour notifier un système de gestion des stocks externe chaque fois qu'une nouvelle commande client est créée dans Dokos.
Résultat : Le stock est mis à jour automatiquement, sans intervention manuelle, malgré l'indisponibilité temporaire du système externe.
Cette section est destinée aux développeurs qui souhaitent personnaliser le comportement des tentatives de renvoi.
Les intervalles de renvoi sont définis dans le fichier frappe/integrations/doctype/webhook/webhook.py. Vous pouvez les modifier en créant un hook dans votre application personnalisée :
# hooks.py
def get_webhook_retry_intervals():
return [
5 * 60, # 5 minutes
30 * 60, # 30 minutes
2 * 60 * 60, # 2 heures
5 * 60 * 60, # 5 heures
10 * 60 * 60 # 10 heures
]
Vous pouvez désactiver les tentatives de renvoi pour un webhook spécifique en utilisant un hook :
# hooks.py
from frappe.integrations.doctype.webhook.webhook import Webhook
def before_webhook_retry(webhook, log):
if webhook.webhook_doctype == "ToDo" and webhook.webhook_doc_event == "after_insert":
return False # Désactive les tentatives pour les webhooks ToDo
Plusieurs raisons peuvent expliquer pourquoi un webhook n'est pas retenté :
Consultez les logs des requêtes Webhook (Paramètres > Intégrations > Log des requêtes Webhook). Les logs marqués comme En attente de renvoi indiquent que le webhook sera retenté à la date et heure spécifiées dans le champ Prochaine tentative.
Non. Pour garantir la cohérence des données, Dokos rejoue toujours le même payload que celui qui a été envoyé lors de la première tentative. Si le document a été modifié entre-temps, ces modifications ne seront pas reflétées dans les tentatives de renvoi.
Pour sécuriser vos webhooks avec une signature HMAC :
Dokos conserve désormais la signature HMAC sous forme de chaîne de caractères, ce qui garantit sa validité lors des tentatives de renvoi.
Si le service externe reste indisponible après le Nombre maximal de tentatives, le statut du webhook passe à Épuisé. Aucune autre tentative ne sera effectuée. Vous pouvez alors :