Article

Réparer après la partition : réconciliation et compensation

Après la partition, les états ont divergé : réconcilier ce qui se recalcule (replay, CRDT, cohérence éventuelle), compenser ce qui a déjà eu lieu (saga).

La partition finit toujours par se refermer. Le réseau revient, le service répond de nouveau — et l'on découvre que, pendant l'absence, deux versions du monde ont continué chacune de leur côté. Certaines se recalculent ; d'autres ont déjà eu lieu, et ne s'effacent pas.
Deux vues divergentes ramenées vers un état réconcilié à partir de la source de vérité, par replay, recalcul ou resynchronisation.
Réconcilier, c'est ramener des représentations divergentes vers un état acceptable depuis la source de vérité — sans supposer qu'elles étaient alignées en permanence.

Quand la connexion revient, une question se pose aussitôt : laquelle des deux versions fait foi ? Pendant la coupure, l'écriture a continué d'un côté, la lecture a servi son état de l'autre, et l'on se retrouve avec deux soldes, deux états de commande, deux projections qui divergent. Le réseau est réparé ; le désaccord, non. Deux outils répondent, à ne pas confondre : on réconcilie ce qui peut se recalculer, on compense ce qui a déjà produit ses effets.

Réconcilier : ramener les états divergents

Réconcilier, c'est ramener des représentations divergentes vers un état acceptable, sans supposer qu'elles étaient alignées en permanence. La réconciliation ne supprime pas la divergence, elle la résout — et elle exige un préalable qu'on oublie parfois d'écrire : désigner une source de vérité. Tant qu'on n'a pas dit qui, de l'écriture ou de la vue, fait foi, aucun rapprochement n'est possible : on n'a que deux opinions équivalentes.

La source désignée, les formes du rattrapage sont connues :

  • le replay d'événements, qui rejoue la suite des faits pour reconstruire l'état dérivé ;
  • le recalcul de projection, qui régénère une vue ou un index depuis la source ;
  • la resynchronisation, qui réaligne une copie sur l'état de référence ;
  • la détection d'écart suivie d'une réparation ciblée, quand seul un sous-ensemble a divergé.

Toutes reposent sur une discipline posée dès la conception : traiter les lectures dérivées comme réparables. Une vue, un index, une projection, un cache ne sont pas des vérités à protéger ; ce sont des dérivés qu'on doit pouvoir reconstruire ou corriger. Le jour où une projection devient une autorité qu'on ne sait plus recalculer, la réconciliation cesse d'être une opération de routine.

Certaines structures évitent même la réconciliation après coup : les CRDT (types de données répliqués sans conflit) sont conçus pour que des répliques ayant reçu les mêmes mises à jour convergent vers le même état sans coordination. Condition : que l'opération de fusion soit commutative, associative et idempotente — reçue dans le désordre ou en double, elle aboutit au même résultat (un compteur, un ensemble). Les opérations qui exigent un arbitrage y échappent.

Au fond, il s'agit de cohérence éventuelle. Ce n'est pas une faiblesse, c'est un contrat — à condition de l'écrire : source de vérité, délai de propagation acceptable, lectures possiblement obsolètes, mécanismes de correction. Le danger n'est pas l'asynchronisme, mais son déni : une cohérence éventuelle assumée et documentée est robuste ; subie et tue, elle se paie en incidents.

Compenser : ce qu'on ne peut pas recalculer

Reste un cas que la réconciliation ne traite pas. Recalculer suppose qu'on puisse refaire le calcul ; or certains effets ont déjà eu lieu hors du système — un mail parti, un paiement engagé, une place réservée chez un tiers — et aucun replay ne les rappelle. L'habitude des transactions locales trompe ici : on y annule d'un rollback, comme si rien n'avait eu lieu. Le monde réel n'a pas de rollback. À travers une frontière, l'effet a déjà eu lieu chez l'autre, et chez l'autre il n'y a pas de bouton d'annulation.

Une saga de trois étapes : réserver, payer, expédier ; l'expédition échoue et déclenche des compensations métier : rembourser, libérer la réservation.
Quand une étape échoue après que d'autres ont produit leurs effets, on ne revient pas en arrière : on compense par un geste métier.

La compensation répond à cette impossibilité. Elle ne consiste pas à annuler techniquement le passé, mais à produire une action métier correcte après un échec ou une divergence : annuler une réservation déjà posée, émettre un avoir plutôt que prétendre n'avoir jamais facturé, rouvrir une capacité consommée, ou notifier un opérateur pour reprise.

La nuance n'est pas que de vocabulaire. Une compensation n'est pas un rollback distribué déguisé : c'est une réponse assumée à une séquence déjà engagée. L'avoir n'efface pas la facture, il lui répond — les deux restent dans l'historique. Une bonne compensation est d'ailleurs observable, explicable et compatible avec l'historique : elle corrige au grand jour.

C'est ce que coordonne une saga : une suite d'actions réparties qui concourent à un résultat métier sans transaction unique. Chaque étape précise son effet, ses conditions d'échec, sa reprise et sa compensation. Quand l'expédition échoue après que le paiement a été pris, la saga ne tente pas l'impossible rollback global : elle déclenche le remboursement et la libération de la place. Reste à prévoir le cas où la compensation elle-même échoue — passerelle de paiement injoignable au moment du remboursement : on la conçoit donc rejouable et idempotente, avec reprise manuelle en dernier recours. Qu'un composant central pilote les étapes (orchestration) ou que chacune réagisse aux événements des autres (chorégraphie) ne change pas le principe — seulement qui tient la partition.

Réconciliation et compensation sont deux réponses au désordre qu'introduit toute frontière : l'une réaligne ce qui se recalcule, l'autre rattrape ce qui a déjà eu lieu. Mais répondre au désordre ne suffit pas ; il faut en amont le borner et le rendre rejouable. C'est le rôle d'une poignée de mécanismes éprouvés, et l'objet du dernier article.

Laisser un commentaire

Vous devez être connecté pour pouvoir laisser un commentaire.