Théorème CAP

Session 3, Partie 2 - 30 minutes

Objectifs d'Apprentissage

  • Comprendre le théorème CAP et ses trois composantes
  • Explorer les compromis entre Cohérence, Disponibilité et Tolérance aux Partitions
  • Identifier les systèmes réels et leurs choix CAP
  • Apprendre à appliquer la pensée CAP à la conception de systèmes

Qu'est-ce que le Théorème CAP ?

Le théorème CAP stipule qu'un magasin de données distribué ne peut fournir que deux des trois garanties suivantes :

graph TB
    subgraph "Triangle CAP - Choisissez-en Deux"
        C["Cohérence<br/>Chaque lecture reçoit<br/>l'écriture la plus récente"]
        A["Disponibilité<br/>Chaque requête reçoit<br/>une réponse"]
        P["Tolérance aux Partitions<br/>Le système opère<br/>malgré les défaillances réseau"]
    end

    C <--> A
    A <--> P
    P <--> C

    style C fill:#ffcdd2
    style A fill:#c8e6c9
    style P fill:#bbdefb

Les Trois Composantes

1. Cohérence (C)

Chaque lecture reçoit l'écriture la plus récente ou une erreur.

Tous les nœuds voient les mêmes données au même moment. Si vous écrivez une valeur et la lisez immédiatement, vous obtenez la valeur que vous venez d'écrire.

sequenceDiagram
    participant C as Client
    participant N1 as Nœud 1
    participant N2 as Nœud 2
    participant N3 as Nœud 3

    C->>N1: Écrire X = 10
    N1->>N2: Répliquer X
    N1->>N3: Répliquer X
    N2-->>N1: Ack
    N3-->>N1: Ack
    N1-->>C: Écriture confirmée

    Note over C,N3: Avant lecture...

    C->>N2: Lire X
    N2-->>C: X = 10 (plus récent)

    Note over C,N3: Tous les nœuds sont d'accord !

Exemple : Un système bancaire où votre solde doit être précis sur toutes les agences.

2. Disponibilité (A)

Chaque requête reçoit une réponse (non-erreur), sans garantie qu'elle contient l'écriture la plus récente.

Le système reste opérationnel même lorsque certains nœuds échouent. Vous pouvez toujours lire et écrire, même si les données peuvent être obsolètes.

sequenceDiagram
    participant C as Client
    participant N1 as Nœud 1 (en vie)
    participant N2 as Nœud 2 (mort)

    C->>N1: Écrire X = 10
    N1-->>C: Écriture confirmée

    Note over C,N2: N2 est en panne mais N1 répond...

    C->>N1: Lire X
    N1-->>C: X = 10

    Note over C,N2: Le système reste disponible !

Exemple : Un fil d'actualités sociales où montrer un contenu légèrement ancien est acceptable.

3. Tolérance aux Partitions (P)

Le système continue à opérer malgré un nombre arbitraire de messages étant abandonnés ou retardés par le réseau entre les nœuds.

Les partitions réseau sont inévitables dans les systèmes distribués. Le système doit les gérer avec grâce.

graph TB
    subgraph "Partition Réseau"
        N1["Nœud 1<br/>Ne peut atteindre N2, N3"]
        N2["Nœud 2<br/>Ne peut atteindre N1"]
        N3["Nœud 3<br/>Ne peut atteindre N1"]
    end

    N1 -.->|"🔴 Partition Réseau"| N2
    N1 -.->|"🔴 Partition Réseau"| N3
    N2 <--> N3
    N2 <--> N3

    style N1 fill:#ffcdd2
    style N2 fill:#c8e6c9
    style N3 fill:#c8e6c9

Aperçu Clé : Dans les systèmes distribués, P n'est pas optionnel — les partitions réseau ARRIVERONT.

Les Compromis

Puisque les partitions sont inévitables dans les systèmes distribués, le vrai choix est entre C et A pendant une partition :

stateDiagram-v2
    [*] --> Normal
    Normal --> Partitionné: Division Réseau
    Partitionné --> CP: Choisir Cohérence
    Partitionné --> AP: Choisir Disponibilité
    CP --> Normal: Partition guérie
    AP --> Normal: Partition guérie

    note right of CP
        Rejeter les écritures/lectures
        jusqu'à la synchronisation des données
    end note

    note right of AP
        Accepter les écritures/lectures
        les données peuvent être obsolètes
    end note

CP : Cohérence + Tolérance aux Partitions

Sacrifier la Disponibilité

Pendant une partition, le système retourne des erreurs ou bloque jusqu'à ce que la cohérence puisse être garantie.

sequenceDiagram
    participant C as Client
    participant N1 as Nœud 1 (primaire)
    participant N2 as Nœud 2 (isolé)

    Note over N1,N2: 🔴 Partition Réseau

    C->>N1: Écrire X = 10
    N1-->>C: ❌ Erreur : Impossible de répliquer

    C->>N2: Lire X
    N2-->>C: ❌ Erreur : Données indisponibles

    Note over C,N2: Le système bloque plutôt<br/>que de retourner des données obsolètes

Exemples :

  • MongoDB (avec souci d'écriture majoritaire)
  • HBase
  • Redis (avec configuration appropriée)
  • SGBD traditionnels avec réplication synchrone

Utiliser lorsque : La précision des données est critique (systèmes financiers, inventaire)

AP : Disponibilité + Tolérance aux Partitions

Sacrifier la Cohérence

Pendant une partition, le système accepte les lectures et écritures, pouvant retourner des données obsolètes.

sequenceDiagram
    participant C as Client
    participant N1 as Nœud 1 (accepte écritures)
    participant N2 as Nœud 2 (a anciennes données)

    Note over N1,N2: 🔴 Partition Réseau

    C->>N1: Écrire X = 10
    N1-->>C: ✅ OK (écrit sur N1 seulement)

    C->>N2: Lire X
    N2-->>C: ✅ X = 5 (obsolète !)

    Note over C,N2: Le système accepte les requêtes<br/>mais les données sont incohérentes

Exemples :

  • Cassandra
  • DynamoDB
  • CouchDB
  • Riak

Utiliser lorsque : Toujours répondre est plus important que la cohérence immédiate (médias sociaux, mise en cache, analyses)

CA : Cohérence + Disponibilité

Possible uniquement dans les systèmes à nœud unique

Sans partitions réseau (nœud unique ou réseau parfaitement fiable), vous pouvez avoir à la fois C et A.

graph TB
    Single["Base de Données à Nœud Unique"]
    Client["Client"]

    Client --> Single
    Single <--> Client

    Note1[Pas de réseau = Pas de partitions]
    Note --> Single

    style Single fill:#fff9c4

Exemples :

  • PostgreSQL à nœud unique
  • MongoDB à nœud unique
  • SGBD traditionnels sur un serveur

Réalité : Dans les systèmes distribués, CA n'est pas achievable car les réseaux ne sont pas parfaitement fiables.

Exemples CAP Réels

SystèmeChoix CAPNotes
Google SpannerCPCohérence externe, toujours cohérent
Amazon DynamoDBAPCohérence configurable
CassandraAPToujours inscriptible, cohérence ajustable
MongoDBCP (par défaut)Configurable en AP
Redis ClusterAPRéplication asynchrone
PostgreSQLCAMode nœud unique
CockroachDBCPSérialisabilité, gère les partitions
CouchbaseAPRéplication Inter-Centres de Données

Modèles de Cohérence

La "Cohérence" du théorème CAP est en fait la linéarisabilité (cohérence forte). Il existe plusieurs modèles de cohérence :

graph TB
    subgraph "Spectre de Cohérence"
        Strong["Cohérence Forte<br/>Linéarisabilité"]
        Weak["Cohérence Faible<br/>Cohérence Finale"]

        Strong --> S1["Cohérence<br/>Séquentielle"]
        S1 --> S2["Cohérence<br/>Causale"]
        S2 --> S3["Cohérence de<br/>Session"]
        S3 --> S4["Lire Vos<br/>Écritures"]
        S4 --> Weak
    end

Modèles de Cohérence Forte

ModèleDescriptionExemple
LinéarisableLecture la plus récente garantieTransferts bancaires
SéquentielleLes opérations apparaissent dans un certain ordreContrôle de version
CausaleOpérations causalement liées ordonnéesApplications de chat

Modèles de Cohérence Faible

ModèleDescriptionExemple
Lire Vos ÉcrituresL'utilisateur voit ses propres écrituresProfil de médias sociaux
Cohérence de SessionCohérence dans une sessionPanier d'achat
Cohérence FinaleLe système converge au fil du tempsDNS, CDN

Exemple Pratique : Panier d'Achat

Voyons comment différents choix CAP affectent un système de panier d'achat :

Approche CP (Bloquer sur Partition)

sequenceDiagram
    participant U as Utilisateur
    participant S as Service

    Note over U,S: 🔴 Partition réseau détectée

    U->>S: Ajouter article au panier
    S-->>U: ❌ Erreur : Service indisponible

    Note over U,S: Utilisateur frustré,<br/>mais panier est toujours précis

Compromis : Ventes perdues, panier précis

Approche AP (Accepter Écritures)

sequenceDiagram
    participant U as Utilisateur
    participant S as Service

    Note over U,S: 🔴 Partition réseau détectée

    U->>S: Ajouter article au panier
    S-->>U: ✅ OK (écrit localement)

    Note over U,S: Utilisateur satisfait,<br/>mais panier peut être en conflit

Compromis : Utilisateurs satisfaits, conflits de fusion possibles ultérieurement

La Simplification "2 sur 3"

Le théorème CAP est souvent mal compris. La réalité est plus nuancée :

graph TB
    subgraph "Réalité CAP"
        CAP["Théorème CAP"]

        CAP --> Malcompréhension["Vous devez choisir<br/>exactement 2"]
        CAP --> Réalité["Vous pouvez avoir les 3<br/>en opération normale"]
        CAP --> Vérité["Pendant partition,<br/>choisir C ou A"]
    end

Aperçus Clés :

  1. P est obligatoire dans les systèmes distribués
  2. Pendant l'opération normale, vous pouvez avoir C + A + P
  3. Pendant une partition, vous choisissez entre C et A
  4. Plusieurs systèmes sont configurables (par exemple, DynamoDB)

Directives de Conception

Choisir CP Lorsque :

  • ✅ Transactions financières
  • ✅ Gestion d'inventaire
  • ✅ Authentification/autorisation
  • ✅ Tout système où les données obsolètes sont inacceptables

Choisir AP Lorsque :

  • ✅ Fils d'actualités sociaux
  • ✅ Recommandations de produits
  • ✅ Analyses et journalisation
  • ✅ Tout système où la disponibilité est critique

Techniques pour Équilibrer C et A :

TechniqueDescriptionExemple
Lectures/écritures de quorumNécessite une reconnaissance majoritaireDynamoDB
Cohérence ajustableLaisser le client choisir par opérationCassandra
Dégradation gracieuseChanger de modes pendant partitionPlusieurs systèmes
Résolution de conflitsFusionner les données divergentes ultérieurementCRDTs

Résumé

Points Clés à Retenir

  1. Théorème CAP : Vous ne pouvez pas avoir les trois dans une partition
  2. La tolérance aux partitions est obligatoire dans les systèmes distribués
  3. Le vrai choix : Cohérence vs Disponibilité pendant partition
  4. Plusieurs systèmes offrent des niveaux de cohérence ajustables
  5. Votre cas d'utilisation détermine le bon compromis

Vérifiez Votre Compréhension

  • Pourquoi la tolérance aux partitions n'est-elle pas optionnelle dans les systèmes distribués ?
  • Donnez un exemple où vous choisiriez CP plutôt que AP
  • Qu'arrive-t-il à un système AP pendant une partition réseau ?
  • Comment les lectures/écritures de quorum peuvent-elles aider à équilibrer C et A ?

🧠 Quiz du Chapitre

Testez votre maîtrise de ces concepts ! Ces questions mettront au défi votre compréhension et révéleront toute lacune dans vos connaissances.

Et Ensuite

Maintenant que nous comprenons les compromis CAP, construisons un simple magasin clé-valeur : Bases du Magasin