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.

Consensus (Raft)

Comment N nœuds se mettent d'accord sur une suite ordonnée d'opérations malgré pannes et délais réseau, sans rester bloqués.

Problème

Plusieurs nœuds maintiennent une même state machine répliquée (registre clés-valeurs, journal métier, leader election table). Il faut s'accorder sur l'ordre exact des écritures pour éviter divergence, et survivre à la panne d'une minorité. Paxos résout ce problème depuis 1989 (Lamport) mais reste réputé incompréhensible. Raft a été conçu pour être implémenté correctement par des équipes ordinaires.

Forces

  • FLP impossibility — pas de consensus parfait en présence d'asynchronie ; il faut un timeout.
  • Plus on a de nœuds dans le quorum, plus la sûreté est forte mais plus la latence d'écriture monte.
  • Une panne réseau peut isoler le leader ; il faut détecter et réélire vite.
  • L'algorithme doit être implémentable par des humains sans crampes au cerveau (Paxos a posé problème).

Solution

Raft décompose le consensus en trois sous-problèmes : (1) élection de leader — un seul leader par terme, élu à la majorité quand le précédent ne renouvelle plus son heartbeat ; (2) réplication du log — le leader reçoit toutes les écritures, les fait valider par une majorité (quorum N/2+1) avant de les committer ; (3) sûreté — un log committé ne peut être perdu ; un nouveau leader doit avoir le log le plus à jour parmi le quorum. La séparation rend l'algorithme didactique et chaque module testable séparément.

Structure

           ┌───────── Term 7 ─────────┐
Client ───► Leader (Node A) ───► Followers (B, C, D, E)
              │                       │
              │ AppendEntries(log[i])  │
              │ ◄─────── ack ──────────┤
              │                       │
              │ when majority ack      │
              │   ──► commit index = i │
              │                       │
              ▼
        State machine apply(log[i])

If leader A goes silent:
  Followers wait election_timeout (150-300ms randomised)
  First to time out becomes candidate, requests votes
  Wins if majority votes ──► becomes leader for term 8

Implémentation EDI

On n'écrit pas un Raft soi-même pour un hub EDI ; on consomme du Raft. Cas type : etcd Raft pour la persistance du registre Kubernetes qui héberge le hub. Ou bien CockroachDB (Raft per range) comme base transactionnelle multi-région d'un hub EDI mondial — chaque commande survit à la perte d'un datacenter. Pour les architectes EDI, comprendre Raft permet de dimensionner correctement les quorums et de calibrer le timeout d'élection en fonction de la latence inter-DC.

Anti-patterns

  • Quorum à 2 nœuds — n'importe quelle panne suspend les écritures (toujours 3, 5 ou 7).
  • Timeout d'élection trop court vs RTT — l'élection ne converge jamais.
  • Bande passante saturée par la réplication — les heartbeats ne passent plus, on déclenche des élections inutiles.
  • Mise à jour de configuration (membership change) sans le protocole joint consensus — split brain garanti.
  • Croire que Raft fournit exactly-once de bout en bout — il faut combiner avec idempotence applicative.

Patterns liés

Sources

  • Ongaro D., Ousterhout J. — In Search of an Understandable Consensus Algorithm, USENIX ATC 2014. raft.github.io/raft.pdf
  • etcd documentation — Raft implementation. etcd.io/docs/v3.5/learning/why
  • Kleppmann M. — Designing Data-Intensive Applications, O'Reilly 2017, chap. 9.