Vol. 8 · № 03 · Un atelier d'architectureAn architecture workshop

CAP & cohérence à terme, ou le théorème qui force à choisirCAP & eventual consistency, or the theorem that forces a choice

Dès qu'une donnée est répliquée, une question devient inévitable : que se passe-t-il quand le réseau coupe entre les copies ? Le théorème CAP répond par un mur — sous partition, on ne peut être à la fois cohérent et disponible. Le « CA » n'existe pas : il faut choisir, par donnée, entre refuser de répondre (CP) et répondre peut-être faux (AP). Numéro final de la série, sur sa thèse de bout en bout : il n'existe pas de geste gratuit.Once data is replicated, a question becomes inescapable: what happens when the network cuts between the copies? The CAP theorem answers with a wall — under a partition, you can't be both consistent and available. 'CA' doesn't exist: you must choose, per datum, between refusing to answer (CP) and answering maybe-wrong (AP). The series' final issue, on its end-to-end thesis: there's no free gesture.

AudienceAudience
Dev qui croit tenir un système « cohérent et toujours disponible », et n'a pas vu la coupure venirDev who thinks they hold a 'consistent and always available' system, and hasn't seen the cut coming
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026June 2026
≈ 18 min●●●○ScalabilitéCAPCohérence à termeDistribuéTradeoff
SommaireContents ·
№ 01CadrageFraming3 min

Cohérent, disponible, tolérant à la partition. Le réseau coupera — il faudra en sacrifier un.Consistent, available, partition-tolerant. The network will cut — you'll sacrifice one.

Le sharding du numéro précédent distribue la donnée pour la capacité ; pour survivre à la panne d'une machine, on réplique chaque morceau sur plusieurs nœuds. Et dès qu'une donnée existe en plusieurs exemplaires, une question devient inévitable : que se passe-t-il quand le réseau coupe entre ces copies ? Le théorème CAP y répond, et sa réponse est un mur. Il énonce qu'un système distribué ne peut garantir simultanément que trois propriétés : la cohérence (toute lecture voit la dernière écriture), la disponibilité (toute requête reçoit une réponse), et la tolérance à la partition (le système continue malgré une coupure réseau). On résume souvent par « choisis-en deux » — mais c'est un raccourci trompeur. Car la partition n'est pas une option qu'on accepte ou refuse : sur un vrai réseau, elle finit toujours par arriver, exactement comme le Vol 7 l'a martelé — le réseau n'est pas fiable. Le vrai énoncé est donc plus dur : quand une partition survient — et elle surviendra —, il faut choisir entre rester cohérent et rester disponible. On ne peut pas avoir les deux pendant la coupure. Le réflexe n'est pas « notre base est cohérente ET disponible » : c'est « quand le réseau cassera, ce système préfère-t-il refuser de répondre, ou répondre peut-être faux ? »The previous issue's sharding distributes data for capacity; to survive one machine's failure, you replicate each piece across several nodes. And once data exists in several copies, a question becomes inescapable: what happens when the network cuts between those copies? The CAP theorem answers, and its answer is a wall. It states that a distributed system cannot simultaneously guarantee three properties: consistency (every read sees the latest write), availability (every request gets a response), and partition tolerance (the system keeps working despite a network cut). It's often summed up as 'pick two' — but that's a misleading shortcut. Because the partition isn't an option you accept or refuse: on a real network, it always ends up happening, exactly as Vol 7 hammered — the network isn't reliable. So the true statement is harder: when a partition occurs — and it will — you must choose between staying consistent and staying available. You can't have both during the cut. The reflex isn't 'our database is consistent AND available': it's 'when the network breaks, does this system prefer to refuse to answer, or to answer maybe-wrong?'

Le code naïf — il réplique, mais il ne choisit pas ce qu'il fait sous partitionThe naive code — it replicates, but it doesn't choose what to do under partition
# deux réplicas pour survivre à une panne. on écrit, on lit, "et c'est cohérent". vraiment ?
def write(key, value):
    primary.put(key, value)
    replica.put(key, value)        # 💥 et si le réseau coupe ICI ? le réplica ne reçoit jamais l'écriture
    return "ok"                    #    on renvoie "ok" — mais les deux copies divergent déjà

def read(key):
    return nearest_node().get(key) # 💥 on lit le nœud le plus proche — qui peut détenir l'ANCIENNE valeur
# tant que le réseau tient, tout va bien. le jour où il coupe — et il coupera —, il faut un CHOIX :
# refuser de répondre pour rester cohérent, ou répondre une valeur peut-être périmée pour rester dispo.
# ce code ne choisit pas. il fait semblant que la partition n'arrive jamais. c'est le seul vrai bug.
Sous partition : refuser, ou répondreUnder partition: refuse, or respond
CP — cohérentCP — consistent
refuse · juste · indisponiblerefuses · correct · unavailable
⇄
sous partitionunder partition
AP — disponibleAP — available
répond · dispo · peut-être périméresponds · available · maybe stale

Quand un nœud ne peut plus joindre ses pairs, il n'a que deux conduites possibles. Soit il refuse de répondre tant qu'il n'est pas sûr de détenir la vérité — il reste cohérent, mais il devient indisponible pour cette donnée. Soit il répond depuis sa propre copie, quitte à servir une valeur que l'autre côté a déjà changée — il reste disponible, mais il devient potentiellement incohérent. Aucune troisième voie n'existe pendant la coupure : c'est l'un ou l'autre, et le choix dépend entièrement de ce que coûte le plus, ici, une mauvaise réponse face à pas de réponse du tout.When a node can no longer reach its peers, it has only two possible conducts. Either it refuses to answer until it's sure it holds the truth — it stays consistent, but becomes unavailable for that data. Or it answers from its own copy, even if it means serving a value the other side has already changed — it stays available, but becomes potentially inconsistent. No third way exists during the cut: it's one or the other, and the choice depends entirely on what costs more, here, a wrong answer versus no answer at all.

Le réflexe — P est imposé, le choix est C ou AThe reflex — P is imposed, the choice is C or A

CAP se lit en trois temps. D'abord, comprendre que la tolérance à la partition n'est pas négociable : tout système réellement distribué subira des coupures réseau, des nœuds injoignables, des paquets perdus — le Vol 7 l'a posé en loi. On ne « choisit » donc pas de renoncer à P ; on doit le supporter. Ensuite, en déduire le vrai choix : puisque P est imposé, le théorème oppose en réalité C et A, et seulement pendant les partitions. Un système CP privilégie la cohérence : sous coupure, il refuse les opérations qu'il ne peut garantir. Un système AP privilégie la disponibilité : sous coupure, il répond toujours, et réconcilie après. Enfin, replacer la nuance : hors partition — c'est-à-dire la plupart du temps —, on n'est plus condamné à sacrifier ; on arbitre alors entre latence et cohérence, ce que l'extension PACELC nomme explicitement. Sauter la première étape, c'est croire qu'on a un système « CA » — un système qui n'existe que tant que le réseau ne tombe jamais.CAP reads in three beats. First, understand that partition tolerance isn't negotiable: any truly distributed system will suffer network cuts, unreachable nodes, lost packets — Vol 7 laid it down as law. So you don't 'choose' to give up P; you must endure it. Then, deduce the real choice: since P is imposed, the theorem actually opposes C and A, and only during partitions. A CP system favors consistency: under a cut, it refuses the operations it can't guarantee. An AP system favors availability: under a cut, it always answers, and reconciles afterward. Finally, restore the nuance: outside a partition — that is, most of the time — you're no longer condemned to sacrifice; you then trade latency against consistency, what the PACELC extension names explicitly. Skipping the first beat means believing you have a 'CA' system — one that exists only as long as the network never falls.

La règle du volume : jamais sans un chiffre — ici, sans un coût.The volume's rule: never without a number — here, without a cost.

CAP n'est pas un pattern qu'on ajoute, c'est une contrainte qu'on subit — mais le choix qu'elle impose, lui, se décide, et il se décide sur un coût mesurable. La question n'est jamais « préfère-t-on, en abstrait, la cohérence ou la disponibilité ? », mais « ici, sur cette donnée précise, combien coûte une réponse fausse, et combien coûte une absence de réponse ? » Servir un solde bancaire périmé, accepter deux fois le dernier billet en stock : une incohérence se chiffre parfois en argent perdu ou en litige — on prend CP. Afficher un nombre de likes en retard de trois secondes, un panier qui se synchronise un instant plus tard : l'incohérence est invisible, l'indisponibilité serait coûteuse — on prend AP. Le clore le volume de la scalabilité, c'est admettre que même ce choix-là, le plus théorique de la série, se tranche avec un chiffre : le coût comparé des deux fautes.CAP isn't a pattern you add, it's a constraint you endure — but the choice it imposes is decided, and decided on a measurable cost. The question is never 'do we prefer, in the abstract, consistency or availability?', but 'here, on this precise piece of data, how much does a wrong answer cost, and how much does no answer cost?' Serving a stale bank balance, accepting the last in-stock item twice: an inconsistency sometimes costs money lost or a dispute — you take CP. Showing a like count three seconds behind, a cart that syncs a moment later: the inconsistency is invisible, the unavailability would be costly — you take AP. Closing the scalability volume means admitting that even this choice, the most theoretical of the series, is settled with a number: the compared cost of the two faults.

№ 02La douleurThe pain4 min

On croit avoir « CA ». On découvre, le jour de la coupure, qu'on n'a rien choisi.You think you have 'CA'. You discover, the day of the cut, that you chose nothing.

Ignorer CAP a trois coûts, et aucun ne se voit tant que le réseau tient — tous arrivent le jour de la première coupure. D'abord, on a cru à un système « CA » : cohérent et toujours disponible, parce qu'on ne l'a jamais vu sous partition. C'est une illusion entretenue par la chance ; le jour où le lien casse, le système choisit à notre place, et rarement comme on l'aurait voulu. Ensuite, le choix par défaut frappe au pire moment : une base configurée par habitude refuse soudain les écritures en pleine panne (indisponibilité subie), ou bien continue d'accepter des deux côtés et laisse les copies diverger (incohérence subie) — sans qu'aucune décision consciente ait été prise. Enfin, la réconciliation arrive sans plan : quand la partition se referme, deux versions de la vérité se font face, et faute d'avoir prévu comment les fusionner, on perd des écritures ou on fige des conflits. Trois douleurs qui partagent une racine : avoir traité une loi du distribué comme un détail d'infrastructure.Ignoring CAP has three costs, and none shows as long as the network holds — all arrive the day of the first cut. First, you believed in a 'CA' system: consistent and always available, because you never saw it under partition. It's an illusion sustained by luck; the day the link breaks, the system chooses for you, and rarely as you'd have wanted. Then, the default choice strikes at the worst moment: a database configured by habit suddenly refuses writes mid-outage (unavailability endured), or keeps accepting on both sides and lets the copies diverge (inconsistency endured) — without any conscious decision being made. Finally, reconciliation arrives with no plan: when the partition heals, two versions of the truth face each other, and for lack of having planned how to merge them, you lose writes or freeze conflicts. Three pains sharing one root: having treated a law of the distributed as an infrastructure detail.

№ 1 · L'illusion du « CA »The 'CA' illusion

« Notre base est cohérente et hautement disponible. » Vrai — tant que le réseau ne coupe jamais. CAP dit précisément qu'il n'existe pas de système distribué CA : la tolérance à la partition n'est pas une fonctionnalité qu'on active, c'est une fatalité du réseau. Croire à un CA, c'est ne pas avoir testé son système sous coupure — et donc ignorer ce qu'il fera le jour J. La chance tient lieu d'architecture, jusqu'à ce qu'elle cesse.'Our database is consistent and highly available.' True — as long as the network never cuts. CAP says precisely that no CA distributed system exists: partition tolerance isn't a feature you enable, it's a network inevitability. Believing in a CA means not having tested your system under a cut — and so ignoring what it'll do on the day. Luck stands in for architecture, until it stops.

№ 2 · Le choix par défaut, au pire momentThe default choice, at the worst moment

Si l'on n'a pas choisi, le système choisit — selon sa configuration par défaut, qu'on n'a pas lue. Une base CP refusera les écritures dès qu'un quorum manque : indisponibilité totale en pleine incident, alors qu'on aurait peut-être préféré servir du périmé. Une base AP acceptera des écritures contradictoires sur chaque îlot : incohérence silencieuse, alors qu'on aurait peut-être exigé l'exactitude. Le défaut n'est jamais neutre ; il est juste invisible jusqu'à la coupure.If you didn't choose, the system chooses — by its default configuration, which you didn't read. A CP database will refuse writes the moment a quorum is missing: total unavailability mid-incident, when you might have preferred to serve stale. An AP database will accept contradictory writes on each island: silent inconsistency, when you might have demanded exactness. The default is never neutral; it's just invisible until the cut.

№ 3 · La réconciliation sans planReconciliation with no plan

La partition finit toujours par se refermer — et là, deux histoires divergentes se retrouvent. Quelle écriture gagne ? Le dernier horodatage (last-write-wins, qui perd silencieusement l'autre) ? Une fusion métier (additionner deux paniers, garder les deux versions) ? Sans stratégie décidée d'avance, on perd des données, on en duplique, ou on fige des conflits qu'un humain devra trancher. L'incohérence à terme n'est tolérable que si la convergence est conçue.The partition always heals eventually — and there, two divergent histories meet. Which write wins? The latest timestamp (last-write-wins, which silently loses the other)? A business merge (sum two carts, keep both versions)? Without a strategy decided up front, you lose data, duplicate it, or freeze conflicts a human will have to settle. Eventual inconsistency is tolerable only if convergence is designed.

Aucun choix explicite — le système improvise sous partitionNo explicit choice — the system improvises under partition
# 10h00 : réseau OK. on écrit "stock = 1" sur les deux réplicas. tout est cohérent.
# 10h05 : le lien entre datacenters CASSE. deux îlots qui ne se voient plus.

# côté A, un client achète le dernier exemplaire :
node_a.put("stock", 0)        # 💥 node_a passe à 0, mais ne peut pas prévenir node_b

# côté B, AU MÊME instant, un autre client achète "le dernier exemplaire" :
node_b.read("stock")          # 💥 renvoie 1 (la valeur d'avant la coupure) → vente acceptée
node_b.put("stock", 0)        #    on a vendu DEUX fois un stock de un. aucun n'a vu l'autre.

# 10h20 : le lien revient. node_a dit stock=0, node_b dit stock=0… mais deux commandes existent.
# sans réconciliation prévue, le conflit est déjà en production — et personne ne l'a décidé.
Le diagnostic.The diagnosis.

Trois questions à poser avant que la coupure ne les pose pour toi. Sur la nature du système : « cette donnée vit-elle sur plusieurs nœuds qui peuvent être séparés par le réseau ? » — si oui, P est imposé, et le choix C-ou-A te concerne, que tu l'aies voulu ou non. Sur le coût des fautes : « ici, que coûte une réponse fausse, et que coûte une absence de réponse ? » — c'est ce rapport, et lui seul, qui désigne CP ou AP. Sur la convergence : « quand la partition se refermera, comment les versions divergentes fusionneront-elles, et qui tranche les conflits ? » — sans réponse, l'AP n'est pas une stratégie, c'est une fuite. Le réflexe : refuser l'illusion du CA, choisir C ou A par type d'opération plutôt qu'une fois pour tout le système, configurer ce choix explicitement (niveau de cohérence, quorums), et concevoir la réconciliation avant d'en avoir besoin. CAP ne se contourne pas ; il se regarde en face, donnée par donnée.Three questions to ask before the cut asks them for you. On the system's nature: 'does this data live on several nodes that can be separated by the network?' — if yes, P is imposed, and the C-or-A choice concerns you, whether you wanted it or not. On the cost of faults: 'here, what does a wrong answer cost, and what does no answer cost?' — it's that ratio, and it alone, that designates CP or AP. On convergence: 'when the partition heals, how will the divergent versions merge, and who settles conflicts?' — without an answer, AP isn't a strategy, it's a leak. The reflex: refuse the CA illusion, choose C or A per operation type rather than once for the whole system, configure that choice explicitly (consistency level, quorums), and design reconciliation before you need it. CAP isn't dodged; it's faced, data by data.

№ 03La partitionThe partition5 min

Sain, coupé, CP, AP, réconcilié — sous partition, cohérent ou disponible, jamais les deux.Healthy, cut, CP, AP, reconciled — under partition, consistent or available, never both.

CAP ne se comprend pas comme un slogan « choisis-en deux », mais comme une bifurcation au moment de la coupure. L'animation suit deux réplicas d'une même donnée à travers cinq instants : le réseau sain où ils s'accordent, la partition qui les isole, puis les deux seules conduites possibles — CP, où un côté refuse pour rester juste, et AP, où les deux répondent au prix de la divergence —, et enfin le retour du lien, où la cohérence à terme réconcilie. Surveille la valeur de chaque nœud, le lien entre eux, et l'étiquette C / A / P : c'est l'instant de la coupure qui révèle ce que le système a vraiment choisi.CAP isn't understood as a 'pick two' slogan, but as a fork at the moment of the cut. The animation follows two replicas of the same data through five instants: the healthy network where they agree, the partition that isolates them, then the only two possible conducts — CP, where one side refuses to stay correct, and AP, where both answer at the price of divergence —, and finally the link's return, where eventual consistency reconciles. Watch each node's value, the link between them, and the C / A / P label: it's the moment of the cut that reveals what the system truly chose.

Animation — deux réplicas, une coupure, et le choix qu'elle imposeAnimation — two replicas, one cut, and the choice it imposes
Réseau sain — cohérent ET disponibleHealthy network — consistent AND available · 1/5
réplica Areplica A
x = 1
répondresponds
⇄
réplicationreplication
réplica Breplica B
x = 1
répondresponds
les deux réplicas s'accordent — cohérentboth replicas agree — consistent
Tant que le lien tient, les deux réplicas répliquent chaque écriture et s'accordent : toute lecture voit la dernière valeur, toute requête reçoit une réponse. On a l'illusion d'un système « CA » — cohérent et disponible à la fois. C'est vrai, mais seulement parce que la partition ne s'est pas encore produite. CAP ne dit rien sur ce moment de calme ; il parle de celui d'après.As long as the link holds, the two replicas replicate every write and agree: every read sees the latest value, every request gets a response. You have the illusion of a "CA" system — consistent and available at once. It's true, but only because the partition hasn't happened yet. CAP says nothing about this calm moment; it speaks of the one after.

Le même write, en mode CP puis en mode AP — choisi explicitement · 3 lignes à retrouverThe same write, in CP then AP mode — chosen explicitly · 3 lines to recall
# le choix CAP n'est pas global : il se règle par opération, via le niveau de cohérence.
def write_balance(key, value, version):    # lectures en QUORUM aussi (R + W > N) : le côté minoritaire refuse → cohérent, mais indisponible.

def write_like(post_id):    # sous partition, chaque côté accepte → disponible, mais divergent. (like = on choisit A)

def reconcile(versions):                      # la cohérence à terme a TOUJOURS besoin d'un plan    # un profil tolérerait last-write-wins ; un compteur, non — LWW y perdrait des likes.
# règle : on ne choisit pas C-ou-A "pour le système", on le choisit par donnée, sur le coût de la faute.
3 ligne(s) à retrouver — écris-la de tête avant de cliquer3 line(s) to recall — write it in your head before clicking
PACELC : le choix continue même sans partition.PACELC: the choice continues even without a partition.

CAP ne parle que du moment de la coupure — or les coupures sont rares, et il serait absurde qu'un théorème ne dise rien des 99 % du temps où le réseau tient. C'est ce que complète PACELC : si Partition (P), on arbitre entre Availability et Consistency — c'est CAP ; sinon (Else, E), on arbitre entre Latency et Consistency. Autrement dit, même réseau sain, garantir qu'une lecture voie toujours la toute dernière écriture impose de consulter plusieurs réplicas, donc d'attendre — de la latence. Pour aller plus vite, on lit un seul nœud, quitte à servir une valeur d'il y a quelques millisecondes. La cohérence n'a donc pas un coût seulement pendant les pannes : elle a un coût permanent, payé en latence le reste du temps. PACELC est l'aveu que le compromis cohérence/disponibilité de CAP n'était qu'une face d'un compromis plus large — cohérence contre rapidité, partout, tout le temps. C'est la dernière nuance de la série : aucune garantie n'est gratuite, pas même quand tout va bien.CAP speaks only of the moment of the cut — yet cuts are rare, and it would be absurd for a theorem to say nothing about the 99% of the time the network holds. That's what PACELC completes: if Partition (P), you trade Availability against Consistency — that's CAP; else (E), you trade Latency against Consistency. In other words, even on a healthy network, guaranteeing that a read always sees the very latest write means consulting several replicas, hence waiting — latency. To go faster, you read a single node, even if it means serving a value from a few milliseconds ago. Consistency thus has a cost not only during failures: it has a permanent cost, paid in latency the rest of the time. PACELC is the admission that CAP's consistency/availability trade-off was only one face of a wider one — consistency against speed, everywhere, all the time. It's the series' last nuance: no guarantee is free, not even when all is well.

Modèle mentalMental model
L'imageThe image

Deux guichets d'une même banque, reliés par téléphone. Tant que la ligne tient, ils tiennent le même registre. La ligne coupe : soit chaque guichet refuse de payer tant qu'il n'a pas rappelé pour vérifier (cohérent, mais fermé), soit chacun paie sur son propre registre (ouvert, mais deux soldes qui divergent).Two counters of the same bank, linked by phone. As long as the line holds, they keep the same ledger. The line cuts: either each counter refuses to pay until it has called back to check (consistent, but closed), or each pays from its own ledger (open, but two balances that diverge).

La règleThe rule

La partition n'est pas optionnelle : quand le réseau coupe, on choisit — par donnée — refuser pour rester juste (CP) ou répondre au risque du périmé (AP), selon le coût comparé des deux fautes.The partition isn't optional: when the network cuts, you choose — per datum — to refuse to stay correct (CP) or to answer at the risk of staleness (AP), by the compared cost of the two faults.

Où l'analogie casseWhere the analogy breaks

Les deux guichets peuvent, au pire, appeler un troisième numéro — le siège — pour trancher. Un système en partition n'a aucun arbitre extérieur : chaque côté est le siège, et il n'existe pas de troisième voie, le fameux « CA », qui resterait juste ET ouvert pendant la coupure. Et rouvrir la ligne ne réconcilie rien tout seul : la règle de fusion doit avoir été choisie avant la panne, sinon on perd une des deux vérités en silence.The two counters can, at worst, call a third number — head office — to settle it. A system in partition has no outside arbiter: each side is head office, and there's no third way, the famous 'CA', that would stay correct AND open during the cut. And reopening the line reconciles nothing on its own: the merge rule must have been chosen before the failure, or you lose one of the two truths in silence.

№ 04Le piègeThe trap4 min

Croire qu'on a « CA », ou choisir AP sans plan de réconciliation.Believing you have 'CA', or choosing AP with no reconciliation plan.

Deux dérives encadrent le bon usage de CAP. La première nie le théorème : on suppose un réseau parfait, on ne configure aucun niveau de cohérence, et l'on croit tenir un système à la fois cohérent et toujours disponible. Le « CA » n'existe pas dans le distribué ; le jour de la coupure, le comportement par défaut tranche à ta place, et souvent dans le mauvais sens. La seconde sur-applique la disponibilité : on choisit AP « parce qu'on veut que ça réponde toujours », mais sans prévoir comment les versions divergentes se rejoindront. Or un AP sans réconciliation n'est pas disponible — il perd des écritures en silence : le last-write-wins par défaut écrase une des deux vérités sans prévenir personne. La première dérive ne choisit pas ; la seconde choisit la moitié d'une stratégie. Bascule le toggle : repère le système qui croit échapper à CAP, et celui qui réclame la disponibilité sans en payer le prix — la convergence.Two drifts frame correct use of CAP. The first denies the theorem: you assume a perfect network, configure no consistency level, and believe you hold a system both consistent and always available. 'CA' doesn't exist in the distributed; the day of the cut, the default behavior settles for you, often the wrong way. The second over-applies availability: you choose AP 'because you want it to always answer', but without planning how the divergent versions will rejoin. Yet an AP with no reconciliation isn't available — it loses writes silently: the default last-write-wins overwrites one of the two truths without telling anyone. The first drift doesn't choose; the second chooses half a strategy. Flip the toggle: spot the system that thinks it escapes CAP, and the one that demands availability without paying its price — convergence.

# on choisit C-ou-A PAR DONNÉE, sur le coût de la faute — pas une fois pour tout le système.
# solde bancaire : une réponse fausse coûte de l'argent → CP. on préfère indisponible que faux.
def debit(account, amount):
    return db.transaction(account, amount, consistency=QUORUM)   # ✓ majorité requise, sinon échec net
    # lecture ET écriture en quorum (R + W > N), débit conditionnel au solde lu (CAS) :
    # sous partition, le côté minoritaire refuse → on ne débite jamais deux fois. (on choisit C)

# compteur de vues : un décalage de 3 s est invisible, l'indisponibilité serait coûteuse → AP.
def increment_views(post_id):
    db.put(post_id, +1, consistency=ONE)                         # ✓ un réplica suffit, on répond toujours

def reconcile_views(versions):                                   # ✓ convergence PRÉVUE d'avance
    return sum(v.delta for v in versions)        # somme commutative → pas de perte au rapprochement
# règle : P est imposé. on décide C ou A là où ça compte, et on conçoit la réconciliation AVANT la coupure.
Pourquoi c'est justeWhy it's right

Le bon usage commence par accepter que P est imposé, puis décide C-ou-A là où ça compte vraiment — donnée par donnée, sur le coût de la faute. Le solde bancaire exige le quorum : sous partition, le côté minoritaire refuse plutôt que de risquer un double débit ; on perd la disponibilité de cette opération, mais jamais l'exactitude — et c'est exactement le bon arbitrage quand une réponse fausse se chiffre en argent. Le compteur de vues, lui, répond depuis un seul réplica : il reste disponible coûte que coûte, parce qu'un décalage de quelques secondes n'a aucune conséquence. Surtout, l'AP est complet : sa réconciliation est conçue d'avance, et choisie pour ne rien perdre — une somme de deltas est commutative, donc deux îlots qui ont chacun incrémenté convergent sans écraser personne. C'est un système qui ne subit pas CAP mais s'en sert : il sait, pour chaque donnée, ce qu'il sacrifie et pourquoi.Correct use begins by accepting that P is imposed, then decides C-or-A where it truly matters — datum by datum, on the cost of the fault. The bank balance demands quorum: under partition, the minority side refuses rather than risk a double debit; you lose that operation's availability, but never its correctness — exactly the right trade when a wrong answer is measured in money. The view counter, in contrast, answers from a single replica: it stays available at all costs, because a few seconds' lag has no consequence. Above all, the AP is complete: its reconciliation is designed in advance, and chosen to lose nothing — a sum of deltas is commutative, so two islands that each incremented converge without overwriting anyone. It's a system that doesn't endure CAP but uses it: it knows, for each datum, what it sacrifices and why.

La règle qui tranche.The rule that settles it.

N'accepte jamais un « CA », et ne choisis l'AP qu'avec sa convergence. Deux tests. Sur le choix : « cette donnée vit sur plusieurs nœuds — quand le réseau coupera, préféré-je qu'elle refuse de répondre (CP) ou qu'elle réponde peut-être faux (AP), et pourquoi ? » — la réponse vient du coût comparé d'une réponse fausse et d'une absence de réponse, sur cette donnée précise, pas sur le système entier. Sur l'AP : « quand la partition se refermera, comment les versions divergentes convergent-elles, et la stratégie peut-elle perdre une écriture sans que personne le sache ? » — si le last-write-wins peut jeter une vérité, ce n'est pas une réconciliation, c'est une perte déguisée. Un système distribué sans choix CAP explicite n'est pas cohérent ni disponible : il est à la merci de sa configuration par défaut.Never accept a 'CA', and choose AP only with its convergence. Two tests. On the choice: 'this data lives on several nodes — when the network cuts, do I prefer it to refuse to answer (CP) or to answer maybe-wrong (AP), and why?' — the answer comes from the compared cost of a wrong answer and no answer, on this precise datum, not the whole system. On AP: 'when the partition heals, how do the divergent versions converge, and can the strategy lose a write without anyone knowing?' — if last-write-wins can throw a truth away, it's not a reconciliation, it's a disguised loss. A distributed system with no explicit CAP choice is neither consistent nor available: it's at the mercy of its default configuration.

Le piège jumeau : la cohérence à terme prise pour de l'incohérence permanente.The twin trap: eventual consistency mistaken for permanent inconsistency.

« Cohérence à terme » sonne comme un renoncement — « le système est incohérent » — alors que c'est une garantie précise : en l'absence de nouvelles écritures, toutes les copies finissent par converger vers la même valeur. Le mot important est « finissent » : il y a une fenêtre, généralement de quelques millisecondes, pendant laquelle des réplicas peuvent répondre différemment. La faute n'est pas de choisir l'AP ; c'est de l'utiliser pour des données qui ne tolèrent aucune fenêtre — un solde, une réservation unique, un verrou. À l'inverse, exiger la cohérence forte partout, par peur de cette fenêtre, c'est payer en latence et en indisponibilité un prix que la plupart des données ne réclament pas. L'art consiste à graduer : forte là où une fausse réponse fait mal, à terme là où le décalage est invisible. La cohérence n'est pas un interrupteur, c'est un curseur — et le régler donnée par donnée est, au fond, tout le métier de ce dernier volume.'Eventual consistency' sounds like a surrender — 'the system is inconsistent' — when it's a precise guarantee: absent new writes, all copies eventually converge to the same value. The key word is 'eventually': there's a window, usually a few milliseconds, during which replicas may answer differently. The fault isn't choosing AP; it's using it for data that tolerates no window — a balance, a unique reservation, a lock. Conversely, demanding strong consistency everywhere, fearing that window, pays in latency and unavailability a price most data doesn't require. The art is to grade it: strong where a wrong answer hurts, eventual where the lag is invisible. Consistency isn't a switch, it's a cursor — and tuning it datum by datum is, at bottom, the whole craft of this final volume.

№ 05Bilan & éditoWrap-up & editorial2 min

Cohérent, ou disponible — et l'architecte est celui qui sait, ici, lequel sacrifier.Consistent, or available — and the architect is the one who knows, here, which to sacrifice.

CAP subi vs CAP choisi, côte à côteCAP endured vs CAP chosen, side by side
CAP subiCAP enduredCAP choisiCAP chosen
La croyanceThe belief« on est cohérent ET dispo »'we're consistent AND available'P est imposé, on choisit C ou AP is imposed, you pick C or A
La granularitéGranularityun défaut global, jamais lua global default, never readpar donnée, sur le coût de la fauteper datum, on the fault's cost
Sous partitionUnder partitionle défaut décide, au pire momentthe default decides, worst momentCP refuse, ou AP répond — vouluCP refuses, or AP responds — intended
À la repriseOn recoverylast-write-wins perd en silencelast-write-wins loses silentlyréconciliation conçue d'avancereconciliation designed up front
Hors partitionOff partitionignoréignoredlatence vs cohérence (PACELC)latency vs consistency (PACELC)

Quand la question CAP ne se pose pasWhen the CAP question doesn't arise

CAP ne s'invite que là où une donnée vit en plusieurs exemplaires séparables par le réseau. On n'a pas à trancher C-ou-A — et c'est tant mieux — quand :CAP only invites itself where data lives in several copies separable by the network. You don't have to settle C-or-A — and so much the better — when:

  • la donnée tient sur un seul nœud non répliqué : pas de copies, pas de partition possible entre elles, pas de dilemme. C'est le cas par défaut, et le plus simple — on n'entre dans CAP qu'en distribuant, et on ne distribue qu'avec un chiffre (le #1 et le #2 de ce volume).the data fits on a single un-replicated node: no copies, no partition possible between them, no dilemma. It's the default case, and the simplest — you enter CAP only by distributing, and you distribute only with a number (this volume's #1 and #2).
  • la cohérence forte est offerte et suffisante : à petite échelle, une base unique transactionnelle donne C et A tant que la machine tient. Tant qu'on n'a pas besoin de plusieurs nœuds, réclamer une architecture « CAP-aware » est de l'optimisation prématurée — précisément ce que ce dernier volume refuse.strong consistency is given and sufficient: at small scale, a single transactional database gives C and A as long as the machine holds. Until you need several nodes, demanding a 'CAP-aware' architecture is premature optimization — precisely what this final volume refuses.
  • l'incohérence est sans conséquence ET la convergence est commutative : compteurs, télémétrie, signaux idempotents qui fusionnent sans perte. Là, AP est un choix par défaut tranquille, parce que la réconciliation est triviale — on prend la disponibilité sans rien risquer.inconsistency is inconsequential AND convergence is commutative: counters, telemetry, idempotent signals that merge without loss. There, AP is a calm default, because reconciliation is trivial — you take availability risking nothing.

Le réflexe n'est donc pas « notre système est CP » ou « notre système est AP », comme une étiquette posée une fois : c'est « cette donnée-ci, quand le réseau coupera, je veux qu'elle refuse plutôt que de mentir — et celle-là, qu'elle réponde quitte à se rattraper après ». CAP ne se choisit pas pour un système ; il se choisit pour chaque vérité qu'il garde.So the reflex isn't 'our system is CP' or 'our system is AP', like a label set once: it's 'this datum, when the network cuts, I want it to refuse rather than lie — and that one, to answer even if it catches up afterward'. CAP isn't chosen for a system; it's chosen for each truth it keeps.

Mot de l'éditeur — et fin de la sérieFrom the editor — and end of the series

Nous finissons sur un théorème, et ce n'est pas un hasard. Le cache du #1 copiait une vérité pour la lire vite ; le sharding du #2 la découpait pour qu'elle tienne ; CAP dit ce qui arrive à toute vérité qu'on a, d'une manière ou d'une autre, dédoublée — et il le dit sous forme d'impossibilité. Pas un pattern de plus à ajouter à la boîte, mais une limite qui borne tous les autres : il n'existe pas de système distribué qui soit, pendant une coupure, à la fois juste et disponible. On ne contourne pas une impossibilité ; on choisit de quel côté tomber, et on l'assume.We end on a theorem, and that's no accident. Issue #1's cache copied a truth to read it fast; issue #2's sharding split it so it would fit; CAP says what happens to any truth you've, one way or another, doubled — and it says it as an impossibility. Not one more pattern to add to the box, but a limit that bounds all the others: no distributed system is, during a cut, both correct and available. You don't dodge an impossibility; you choose which side to fall on, and you own it.

C'est, en une image, ce que cette série aura répété de bout en bout : il n'existe pas de geste gratuit. Chaque pattern résout un problème en en achetant un autre, et l'architecture n'est pas la collection des solutions — c'est la lucidité sur les prix. Le découplage qu'on a célébré au début se paie en latence et en cohérence à terme ; la résilience du Vol 7 se paie en idempotence et en complexité ; la vitesse de ce dernier volume se paie en fraîcheur, en transactions perdues, et finalement en ce choix CAP qu'aucune ingéniosité n'efface. Le débutant cherche le bon pattern ; l'architecte connaît le coût de chacun, et choisit lequel payer ici, sur cette donnée, pour ce métier. C'est tout. C'est immense.That, in one image, is what this series will have repeated from end to end: there's no free gesture. Each pattern solves a problem by buying another, and architecture isn't the collection of solutions — it's clarity about the prices. The decoupling celebrated at the start is paid in latency and eventual consistency; Vol 7's resilience is paid in idempotency and complexity; this final volume's speed is paid in freshness, in lost transactions, and finally in this CAP choice no ingenuity erases. The beginner looks for the right pattern; the architect knows the cost of each, and chooses which to pay here, on this datum, for this domain. That's all. That's everything.

Neuf volumes, et une seule question, posée chaque fois sous un angle nouveau : « qu'est-ce que ça coûte, et suis-je prêt à le payer ? » Si tu la poses désormais par réflexe — devant un cache comme devant un disjoncteur, un event store ou une frontière de service —, alors la série a fait son travail, et tu n'as plus besoin d'elle. Merci de l'avoir lue jusqu'ici. La boucle est bouclée.Nine volumes, and a single question, asked each time from a new angle: 'what does it cost, and am I willing to pay it?' If you now ask it by reflex — facing a cache as facing a circuit breaker, an event store, or a service boundary —, then the series has done its work, and you no longer need it. Thank you for reading this far. The loop is closed.

Les voisins que ce numéro débloqueThe neighbors this issue unlocks

  • Eventual consistency — la garantie qu'offre le côté A de CAP, souvent mal entendue. Elle ne dit pas « le système est incohérent », mais « en l'absence de nouvelles écritures, toutes les copies finissent par converger ». C'est le contrat des systèmes AP : on répond toujours, on accepte une fenêtre de divergence de quelques millisecondes, et on garantit la convergence — à condition de l'avoir conçue (last-write-wins, fusion métier, ou CRDT, ces types de données qui fusionnent sans conflit par construction). Tolérer la cohérence à terme, c'est accepter un décalage borné en échange d'une disponibilité totale.the guarantee CAP's A side offers, often misheard. It doesn't say 'the system is inconsistent', but 'absent new writes, all copies eventually converge'. It's the contract of AP systems: you always answer, accept a divergence window of a few milliseconds, and guarantee convergence — provided you designed it (last-write-wins, business merge, or CRDTs, those data types that merge without conflict by construction). Tolerating eventual consistency means accepting a bounded lag in exchange for total availability.
  • Quorum (R + W > N) — le curseur concret entre C et A. Sur N réplicas, on exige qu'une écriture soit confirmée par W d'entre eux et une lecture par R. Si R + W > N, lecture et écriture se recouvrent forcément sur au moins un réplica à jour : cohérence forte. En abaissant R ou W, on gagne en disponibilité et en latence ce qu'on perd en garantie. Le quorum n'est pas un réglage binaire CP/AP : c'est la molette qui permet de doser, par opération, exactement où l'on place le compromis du théorème.the concrete cursor between C and A. Over N replicas, you require a write to be confirmed by W of them and a read by R. If R + W > N, read and write necessarily overlap on at least one up-to-date replica: strong consistency. By lowering R or W, you gain in availability and latency what you lose in guarantee. The quorum isn't a binary CP/AP setting: it's the dial that lets you tune, per operation, exactly where you place the theorem's trade-off.
  • PACELC — l'extension qui complète CAP pour les 99 % du temps où le réseau tient. Elle se lit : si Partition, alors Availability vs Consistency (c'est CAP) ; sinon (Else), Latency vs Consistency. Autrement dit, la cohérence forte a un coût même sans panne — chaque lecture garantie « à jour » impose d'attendre plusieurs réplicas. PACELC rappelle que le compromis de CAP n'était qu'un cas particulier d'un compromis permanent entre cohérence et rapidité, et qu'aucune garantie n'est jamais gratuite — la note exacte sur laquelle cette série choisit de s'achever.the extension that completes CAP for the 99% of the time the network holds. It reads: if Partition, then Availability vs Consistency (that's CAP); else, Latency vs Consistency. In other words, strong consistency has a cost even without a failure — every read guaranteed 'up to date' requires waiting on several replicas. PACELC reminds that CAP's trade-off was only a special case of a permanent one between consistency and speed, and that no guarantee is ever free — the exact note on which this series chooses to end.

Le kata de décision — tranche avant de déroulerThe decision kata — settle it before you scroll

CAP ne s'écrit pas en trente lignes : il se décide. Voici trois données réelles, chacune répliquée sur plusieurs nœuds. Pour chacune, une seule question — sous partition, CP (refuser pour rester juste) ou AP (répondre au risque du périmé) ? — et, quand c'est AP, la question qui compte vraiment : comment converge-t-on ? Parie avant de dérouler ; la réponse tient sur le coût comparé des deux fautes, pas sur une préférence.CAP isn't written in thirty lines: it's decided. Here are three real data items, each replicated across several nodes. For each, one question — under partition, CP (refuse to stay correct) or AP (answer at the risk of staleness)? — and, when it's AP, the question that really counts: how do you converge? Bet before you scroll; the answer rests on the compared cost of the two faults, not on a preference.

Chez toi, cette semaine.In your codebase, this week.

Ouvre la configuration de ta base répliquée (ou de son driver) et cherche le niveau de cohérence réellement en vigueur : grep -rniE "consistency|readconcern|writeconcern|quorum|local_one|eventual" .. Beaucoup d'équipes découvrent qu'elles n'ont jamais choisi — c'est le défaut du driver qui tranche sous partition. Prends ensuite tes trois données les plus critiques et, pour chacune, réponds à la question du chapitre 4 : « sous partition, je la veux CP ou AP — et le réglage actuel correspond-il à cette réponse ? »Open your replicated database's configuration (or its driver's) and find the consistency level actually in force: grep -rniE "consistency|readconcern|writeconcern|quorum|local_one|eventual" .. Many teams discover they never chose — the driver's default settles it under partition. Then take your three most critical data items and, for each, answer chapter 4's question: 'under partition, do I want it CP or AP — and does the current setting match that answer?'