ediverse Explorer la plateforme

À la une PEPPOL BIS Billing 3.0 L’obligation européenne d’e-invoicing arrive : France sept 2026, Belgique janv 2026, Allemagne 2025.

Outbox (architectural)

La table tampon qui transforme deux écritures non-coordonnées (DB + broker) en une écriture atomique côté DB.

Problème

Sans XA broker (Kafka), comment garantir qu'un side effect métier (création d'une commande) et son message publié au broker arrivent tous deux ou aucun — sans verrouiller l'application en cas de broker down ?

Forces

  • Une écriture broker pendant une transaction DB n'est pas transactionnelle.
  • Un broker down ne doit pas bloquer la prise de commande dans l'application.
  • Un retry de publication doit être idempotent côté broker.
  • Le poller doit avoir un throughput suffisant pour ne pas accumuler le backlog.

Solution

Créer une table `outbox` (id, aggregate_type, aggregate_id, payload, status, created_at). Le producer insère son message dans `outbox` au sein de la même transaction que les modifications métier (un seul COMMIT). Un poller dédié — souvent Debezium CDC sur la table outbox — lit les nouvelles lignes et publie sur le broker. À publication réussie, status passe à `SENT`. À échec, retry avec backoff. La PK ou un message_id stable assure l'idempotence côté broker.

Implémentation EDI

En EDI, l'Outbox est le pattern dominant pour relier ERP → Kafka EDI hub. L'ERP insère l'event 'OrderConfirmed' dans `outbox` au sein de la transaction qui confirme la commande. Debezium reads PostgreSQL WAL, publie sur `edi.orders.confirmed`. Le hub EDI consomme et émet l'ORDRSP au partenaire. Bonus : la table outbox sert aussi de message store pour rejeu et audit — utile en cas d'incident d'export du broker.

Anti-patterns

  • Outbox sans index sur status / created_at — le poller scan toute la table à chaque cycle.
  • Outbox sans purge — la table gonfle indéfiniment et ralentit le poller.
  • Outbox sans idempotency message_id — un retry duplique le message côté broker.
  • Poller mono-threadé avec un haut throughput — le poller devient le bottleneck.

Patterns liés

Sources