Webhooks
Livraison, signature et nouvelles tentatives des webhooks sortants.
Webhooks
ObjectOS utilise un modèle d'outbox persistant pour les webhooks sortants. Lorsque le plugin de webhooks est activé, les changements métier mettent en file d'attente une ligne de livraison, et un distributeur en arrière-plan la livre avec des nouvelles tentatives — de sorte qu'un récepteur lent ou indisponible ne bloque jamais la transaction d'origine.
Activer les webhooks
Les webhooks sont une capacité optionnelle. L'image ObjectOS déployée
doit inclure @objectstack/plugin-webhooks, et l'artefact applicatif
doit enregistrer des abonnements de webhooks (généralement sous forme
d'enregistrements d'un objet sys_webhook).
Une fois activés, deux objets apparaissent dans la Console :
| Objet | Rôle |
|---|---|
sys_webhook | Abonnement au webhook (URL cible, filtre d'événements, secret, statut) |
sys_webhook_delivery | Journal de livraison (URL, code de réponse, nombre de tentatives, horodatage de la nouvelle tentative) |
Sémantique de livraison
- Au moins une fois. Une livraison peut être retentée après un échec transitoire ; les récepteurs doivent être idempotents.
- Persistante. Les livraisons survivent aux redémarrages d'ObjectOS car elles sont stockées dans la base de données métier.
- Partitionnée. Chaque worker du distributeur revendique une partition de l'outbox, de sorte que les déploiements peuvent mettre à l'échelle horizontalement la distribution sans double livraison.
- Nouvelles tentatives bornées. Les livraisons échouées sont
retentées avec un délai progressif jusqu'à un plafond configurable ;
les lignes épuisées restent dans
sys_webhook_deliverypour inspection.
Signature
Chaque livraison comporte des en-têtes d'identification afin que les récepteurs puissent l'acheminer, la dédupliquer et la vérifier :
X-Objectstack-Event: <event type, e.g. data.record.created>
X-Objectstack-Delivery: <delivery id — use as your idempotency key>
X-Objectstack-Attempt: <attempt number, starting at 1>Lorsqu'un abonnement de webhook possède un secret, ObjectOS signe
également chaque requête :
X-Objectstack-Signature: sha256=<hex hmac>La signature est HMAC-SHA256(secret, body), calculée sur le corps brut
de la requête. Vérifiez-la côté récepteur avant de faire confiance à la
charge utile :
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(body, signatureHeader, secret) {
const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
return timingSafeEqual(Buffer.from(signatureHeader), Buffer.from(expected));
}Faites tourner les secrets en créant un nouvel abonnement avec le nouveau secret, en exécutant les deux pendant une fenêtre de transition, puis en désactivant l'ancien.
Attentes côté récepteur
- Répondez avec un
2xxen quelques secondes. Une réponse408,429ou5xx(ou un délai d'attente / une erreur de transport) est retentable et donne lieu à une nouvelle tentative avec délai progressif. Tout autre4xxest traité comme un échec permanent et déplacé versdeadsans nouvelle tentative. - Le distributeur ne marque pas une livraison comme réussie tant
qu'il ne reçoit pas un
2xx; ainsi, un récepteur défaillant conserve la ligne danssys_webhook_deliverypour inspection ou nouvelle livraison. - Soyez idempotent — dédupliquez sur l'en-tête
X-Objectstack-Delivery(l'identifiant de livraison) ou sur votre propre identifiant d'événement dans la charge utile.
Gestion des échecs
Lorsqu'une erreur survient :
- Consultez la ligne dans
sys_webhook_delivery—status,response_code,response_bodyetattemptsy sont enregistrés. - Vérifiez l'accès réseau sortant d'ObjectOS vers le récepteur.
- Si le récepteur a été modifié de façon permanente, mettez à jour l'URL de l'abonnement et relivrez la ligne depuis la Console.
- Pour l'analyse des incidents, les journaux d'audit
(
sys_audit_log) capturent les modifications d'abonnement mais pas les charges utiles — celles-ci restent dans l'outbox.
Conseils opérationnels
- Ne placez pas de secrets dans les URL de webhook (les chaînes de requête sont journalisées).
- Utilisez un nom d'hôte de récepteur dédié afin de pouvoir délester la charge en le bloquant en périphérie sans affecter l'application principale.
- Surveillez le retard du distributeur — un outbox qui grossit signifie généralement que le récepteur est dégradé.