Théorème CAP : comprendre cohérence, disponibilité et partition
Deux caisses partagent un stock, puis perdent leur connexion. Cet exemple explique les trois notions de CAP et les choix possibles pendant une coupure réseau.
Article
CAP aide à choisir quelles opérations peuvent continuer pendant une coupure réseau. Il ne suffit pas à décrire les performances ou la fiabilité d’un système.
Un service de réservation ne peut plus joindre la machine qui tient le stock. Il peut attendre, refuser la réservation ou accepter une demande sans la confirmer. CAP aide à comprendre ce choix : pendant une coupure, garantir une réponse à chaque opération peut empêcher de garantir que toutes les réponses respectent le même état des données. La décision dépend de ce que l'opération promet au client.
CAP concerne un système dont plusieurs machines partagent des données. Il montre une impossibilité : face à certaines pertes de communication, le système ne peut pas garantir à la fois la cohérence stricte des données et une réponse à chaque demande reçue par une machine qui fonctionne.
La preuve de Gilbert et Lynch, publiée en 2002, donne un sens précis aux trois lettres :
L'exemple des deux caisses et du dernier produit en stock détaille ces notions. Pour les appliquer, il faut surtout préciser la garantie attendue de chaque opération.
Une page peut afficher un stock récemment calculé en indiquant l'heure de mise à jour. Une confirmation de réservation engage davantage : le client s'attend à ce qu'un exemplaire lui soit réellement attribué.
Pendant une coupure, ces opérations peuvent donc adopter des comportements différents :
| Opération | Comportement possible | Conséquence à accepter |
|---|---|---|
| Afficher une disponibilité indicative | Lire la copie locale et signaler sa date | L'information peut être dépassée |
| Garantir une réservation sur un stock partagé | Attendre ou refuser si la vérification fiable est impossible | Le client ne peut pas réserver immédiatement |
| Enregistrer une demande à confirmer | Conserver l'intention pour la traiter après la reprise | La demande peut être refusée plus tard |
La troisième ligne change le service proposé : une demande en attente ne vaut pas réservation garantie. Il faut que le message présenté au client rende cette différence visible.
Je préfère décrire ces comportements avant d'attribuer une étiquette à l'architecture. L'équipe peut alors vérifier, par un test de coupure, que chaque opération tient la promesse annoncée.
Le raccourci laisse penser que cohérence, disponibilité et partitions sont trois options comparables. Pourtant, renoncer à traiter les partitions ne rend pas le réseau fiable : cela revient à limiter les conditions dans lesquelles vous garantissez le fonctionnement.
Eric Brewer est revenu sur cette formulation en 2012. Il souligne notamment que le choix peut varier selon l'opération ou la donnée. Une application n'a donc pas besoin d'adopter la même réponse à une panne pour tous ses usages.
Les appellations « CP » et « AP » désignent couramment une préférence pour la cohérence ou la disponibilité sous partition. Elles restent insuffisantes pour comprendre un produit réel. Il faut connaître les opérations concernées, les modes de panne considérés et les garanties exactes.
Martin Kleppmann critique précisément ces classifications : les définitions du théorème ne couvrent pas tous les aspects qui intéressent les utilisateurs d'une base de données. Le comportement documenté et testé apporte une information plus utile.
Quand une réponse tarde, le client ignore parfois si le serveur est arrêté, si le message a été perdu ou si le traitement continue. Un délai d'attente dépassé, ou timeout, indique cette incertitude ; il ne permet pas à lui seul d'en connaître la cause.
En pratique, vous fixez une durée au-delà de laquelle l'opération ne peut plus attendre. À cet instant, elle doit disposer d'un comportement prévu : échouer, présenter une information ancienne ou enregistrer une demande à reprendre.
Plusieurs incidents peuvent provoquer ce besoin : une liaison interrompue, un service externe indisponible ou une file de messages qui n'avance plus. Il reste nécessaire de les distinguer pour les réparer.
De même, un doublon ou un message reçu dans le désordre n'est pas, à lui seul, la preuve d'une partition. Et une copie de lecture mise à jour volontairement en différé peut être en retard alors que tout fonctionne normalement. Ces situations demandent des protections différentes.
Lorsque les communications fonctionnent, CAP n'impose pas de choisir entre cohérence et disponibilité. Pour autant, maintenir plusieurs copies à jour demande des échanges, et ces échanges prennent du temps.
Daniel Abadi a proposé PACELC en 2010, puis l'a développé en 2012, pour distinguer deux situations. Pendant une partition, le compromis porte sur disponibilité et cohérence. En fonctionnement normal, il porte notamment sur le délai de réponse et la cohérence.
Une lecture locale peut répondre vite sans attendre la dernière mise à jour. Une lecture qui exige de vérifier plusieurs machines attend leur coordination. Cette décision existe même sans incident réseau.
Pour une réservation, un paiement ou un affichage, notez les informations qu'il faut obtenir et le délai acceptable. Précisez ensuite ce que le client reçoit si ces informations restent inaccessibles.
Le travail continue à la reconnexion : les demandes en attente doivent être traitées, les copies rapprochées et les promesses incompatibles résolues. L'article sur la réconciliation après une coupure traite cette reprise. Un mode dégradé n'est utilisable que si le service sait aussi en sortir.
Explorer
Choisis dans l’index d’après les étiquettes de cet article — les plus proches d’abord, hors de sa série. Rien n’est écrit à la main : un article publié demain avec les mêmes étiquettes y prendra place.
Deux caisses partagent un stock, puis perdent leur connexion. Cet exemple explique les trois notions de CAP et les choix possibles pendant une coupure réseau.
Une commande validée peut manquer quelques instants dans une liste, même dans un monolithe. Voici d’où vient ce délai et comment le rendre compréhensible.
Dans un monolithe, un traitement différé peut laisser deux modules en décalage. Quand faut-il attendre une réponse et comment gérer une mise à jour tardive ?
Laisser un commentaire
Votre commentaire sera relu avant d'être publié.