Quan les dades es reparteixen i repliquen entre diversos nodes, sorgeix una pregunta fonamental: podem garantir alhora que totes les lectures vegin la dada més recent, que el sistema respongui sempre i que toleri errors de xarxa? El Teorema CAP demostra que no: cal triar. Comprendre aquesta concessió és essencial per dissenyar l'emmagatzematge de dades de qualsevol sistema distribuït, i per triar correctament entre les desenes de bases de dades disponibles avui.
En aquesta lliçó estudiarem el Teorema CAP, el seu refinament PACELC, la diferència entre consistència forta i eventual, i classificarem les bases de dades més comunes segons les garanties que ofereixen.
Contingut
- Les tres propietats: C, A i P
- L'enunciat del Teorema CAP
- Per què P no és opcional a la pràctica
- CP enfront d'AP: l'elecció real
- PACELC: més enllà de CAP
- Consistència forta enfront d'eventual
- Taula de bases de dades segons CAP
- Errors comuns i consells
- Exercicis
- Conclusió
- Les tres propietats: C, A i P
El Teorema CAP, formulat per Eric Brewer, parla de tres propietats d'un sistema de dades distribuït:
| Propietat | Significat |
|---|---|
| C — Consistència | Tota lectura retorna l'escriptura més recent o un error. Tots els nodes veuen la mateixa dada alhora. |
| A — Disponibilitat | Tota petició rep una resposta (no error), encara que pugui no ser la dada més recent. |
| P — Tolerància a particions | El sistema continua funcionant malgrat que es perdin missatges entre nodes (una "partició" de xarxa). |
Compte: la "Consistència" de CAP no és la "C" d'ACID. Aquí significa que totes les rèpliques coincideixen, no la integritat transaccional.
- L'enunciat del Teorema CAP
El teorema afirma:
En presència d'una partició de xarxa, un sistema distribuït només pot garantir dues de les tres propietats: o consistència, o disponibilitat, però no totes dues.
graph TD
CAP[Teorema CAP] --> C[Consistència]
CAP --> A[Disponibilitat]
CAP --> P[Tolerància a particions]
C -.- nota["Davant una partició:<br/>tria C o A"]
A -.- notaImagina dos nodes replicats que deixen de comunicar-se (partició). Arriba una escriptura a un d'ells. Ara una lectura arriba a l'altre node, que no té aquesta escriptura. El sistema ha de decidir:
- Retornar la dada vella (manté la disponibilitat, sacrifica la consistència).
- Rebutjar la lectura o esperar (manté la consistència, sacrifica la disponibilitat).
No hi ha tercera opció. Per això CAP és una elecció, no un bufet.
- Per què P no és opcional a la pràctica
Molta gent creu que pot triar "CA" (consistència i disponibilitat, renunciant a P). En un sistema realment distribuït això és una il·lusió: les particions de xarxa ocorren (cables que es tallen, commutadors que fallen, latències extremes). No pots garantir que mai no hi haurà una partició.
Per tant, en un sistema distribuït la P és obligatòria, i l'elecció real es redueix a:
- CP: davant una partició, prioritzo la consistència (puc deixar de respondre).
- AP: davant una partició, prioritzo la disponibilitat (puc retornar dades velles).
Un sistema "CA" només té sentit en una única màquina (una base de dades relacional clàssica en un sol servidor), on no hi ha xarxa per particionar.
- CP enfront d'AP: l'elecció real
La decisió depèn del cas de negoci:
| Escenari | Elecció | Raó |
|---|---|---|
| Saldo bancari, estoc crític | CP | Millor un error que una dada incorrecta. |
| Cistella de la compra, catàleg | AP | Millor respondre alguna cosa que caure. |
| Reserva de places limitades | CP | No volem vendre dues vegades el mateix. |
| Comptador de visites, "m'agrada" | AP | Un petit desfasament és irrellevant. |
graph LR
P[Hi ha partició de xarxa] --> D{Què prioritzo?}
D -->|Consistència| CP[CP: rebutjo o espero<br/>per no donar dades errònies]
D -->|Disponibilitat| AP[AP: responc amb<br/>possible dada desactualitzada]La pregunta guia sempre és: què és pitjor per al meu negoci, donar una resposta incorrecta o no donar resposta?
- PACELC: més enllà de CAP
CAP només parla de què passa durant una partició, que és una cosa poc freqüent. PACELC, formulat per Daniel Abadi, completa el quadre afegint què passa la resta del temps:
Partition: Availability o Consistency; Else (en operació normal): Latency o Consistency.
En altres paraules:
- Si hi ha Partició → tries entre A i C (com a CAP).
- Si no n'hi ha (Else) → tot i així tries entre Latència i Consistència, perquè garantir consistència forta entre rèpliques exigeix coordinació, que costa temps.
| Sistema | Classificació PACELC | Lectura |
|---|---|---|
| Cassandra | PA/EL | Prioritza disponibilitat i baixa latència. |
| MongoDB | PA/EC (configurable) | Disponible en partició, consistent en operació normal. |
| Sistemes amb consens fort | PC/EC | Prioritzen consistència sempre, a costa de latència. |
PACELC és més útil que CAP en el dia a dia, perquè la major part del temps no hi ha particions, i tot i així pagues un preu per la consistència.
- Consistència forta enfront d'eventual
| Model | Garantia | Cost | Quan usar-lo |
|---|---|---|---|
| Forta | Tota lectura veu l'última escriptura. | Major latència, menor disponibilitat. | Diners, estoc, reserves. |
| Eventual | Les rèpliques convergeixen "amb el temps". | Possibles lectures desfasades. | Catàlegs, comptadors, feeds. |
La consistència eventual no significa "dades incorrectes per sempre", sinó que, si deixen d'arribar escriptures, totes les rèpliques acaben coincidint. Existeixen nivells intermedis útils, com ara read-your-own-writes (un usuari sempre veu els seus propis canvis).
-- A Cassandra, el nivell de consistència es tria per consulta.
-- QUORUM: confirma en la majoria de rèpliques (equilibri).
CONSISTENCY QUORUM;
INSERT INTO polizas (id, ramo) VALUES ('POL-00123', 'hogar');
-- ONE: confirma amb una sola rèplica (ràpid, menys consistent).
CONSISTENCY ONE;
SELECT * FROM polizas WHERE id = 'POL-00123';L'interessant de sistemes com Cassandra és que ajustes la consistència per operació: escriptures crítiques amb QUORUM, lectures tolerants amb ONE. Si lectures i escriptures sumen més rèpliques que el total (W + R > N), obtens consistència forta sobre un sistema base AP.
- Taula de bases de dades segons CAP
Una classificació orientativa (moltes són configurables i poden moure's de categoria):
| Base de dades | Tipus | CAP típic | Notes |
|---|---|---|---|
| PostgreSQL / MySQL (un node) | Relacional | CA | Sense partició real en ser un sol node. |
| MongoDB | Documental | CP (per defecte) | Prioritza consistència; configurable. |
| HBase | Columnar | CP | Construïda sobre HDFS, consistent. |
| Redis (clúster) | Clau-valor | CP | Coherència sobre disponibilitat. |
| Cassandra | Columnar | AP | Consistència ajustable per consulta. |
| DynamoDB | Clau-valor | AP (configurable) | Eventual per defecte, forta opcional. |
| Riak | Clau-valor | AP | Pensada per a alta disponibilitat. |
| CouchDB | Documental | AP | Replicació i resolució de conflictes. |
Pren aquesta taula com a guia, no com a dogma: la configuració concreta (factors de replicació, nivells de consistència) determina el comportament real.
Errors Comuns i Consells
- Confondre la C de CAP amb la C d'ACID: en CAP és "totes les rèpliques coincideixen"; en ACID és "integritat transaccional". No són el mateix.
- Creure que pots triar CA en un sistema distribuït: les particions ocorren; has de triar entre CP i AP.
- Aplicar consistència forta a tot: encareix la latència i redueix la disponibilitat sense necessitat. Reserva la forta per a dades crítiques.
- Ignorar PACELC: el cost de la consistència es paga també quan NO hi ha particions, en forma de latència.
- Triar base de dades per moda: tria segons les garanties que el teu cas de negoci necessita, no per la tecnologia més sonada.
Exercicis
- Enuncia el Teorema CAP i explica per què, en un sistema distribuït real, l'elecció pràctica es redueix a CP o AP.
- Per a cada cas, indica si triaries consistència forta (CP) o eventual (AP) i justifica-ho: (a) saldo d'un compte bancari, (b) nombre de "m'agrada" d'una publicació, (c) reserva d'una butaca en un cinema.
- Explica què aporta PACELC enfront de CAP i què significa la classificació "PA/EL".
Solucions
-
CAP diu que, davant una partició de xarxa, un sistema distribuït només pot garantir dues de les tres propietats (C, A, P). Com que les particions són inevitables en un sistema realment distribuït, P és obligatòria; per tant, l'elecció real és entre CP (sacrificar disponibilitat per mantenir consistència) i AP (sacrificar consistència per mantenir disponibilitat).
-
(a) CP/forta: un saldo incorrecte és inacceptable; millor un error que una dada errònia. (b) AP/eventual: un desfasament momentani en els "m'agrada" és irrellevant; prima respondre sempre. (c) CP/forta: no podem vendre la mateixa butaca dues vegades, així que la consistència mana.
-
PACELC afegeix què passa quan no hi ha partició: fins i tot llavors cal triar entre Latència i Consistència. "PA/EL" significa: davant una Partició prioritza la disponibilitat (A), i en operació normal (Else) prioritza la baixa Latència (a costa de consistència). És el perfil de sistemes com Cassandra.
Conclusió
Hem après que el Teorema CAP imposa una concessió inevitable: davant una partició de xarxa, cal triar entre consistència (CP) i disponibilitat (AP). PACELC refina la idea recordant que, fins i tot sense particions, paguem en latència per la consistència. L'elecció entre consistència forta i eventual, i la base de dades que la sustenta, han de respondre sempre a les necessitats del negoci: és pitjor una resposta incorrecta o cap resposta?
Amb aquesta lliçó tanquem el Mòdul 4, Arquitectures Distribuïdes i Microserveis. Has recorregut el camí complet: des dels fonaments dels sistemes distribuïts i les seves fal·làcies, passant per la descomposició en microserveis i bounded contexts, els mecanismes de comunicació, els patrons de resiliència, fins a les concessions de consistència de dades. Aquests coneixements et permeten dissenyar sistemes distribuïts robustos, conscients dels seus límits i adequats a cada problema de negoci.
Curs d'Arquitectura d'Aplicacions
Mòdul 1: Fonaments de l'Arquitectura d'Aplicacions
- Què és l'Arquitectura d'Aplicacions?
- El Rol de l'Arquitecte de Programari
- Atributs de Qualitat i Requisits No Funcionals
- Decisions Arquitectòniques i Compromisos (Trade-offs)
- Documentació d'Arquitectura: Vistes i el Model C4
Mòdul 2: Principis i Tàctiques de Disseny
- Acoblament, Cohesió i Separació de Responsabilitats
- Principis SOLID Aplicats a l'Arquitectura
- DRY, KISS, YAGNI i Altres Principis de Disseny
- Tàctiques Arquitectòniques per als Atributs de Qualitat
- Gestió del Deute Tècnic
Mòdul 3: Estils i Patrons Arquitectònics
- Arquitectura Monolítica
- Arquitectura en Capes (N-Tier)
- Arquitectura Client-Servidor
- Arquitectura Hexagonal (Ports i Adaptadors)
- Arquitectura Neta i Ceba (Clean & Onion)
Mòdul 4: Arquitectures Distribuïdes i Microserveis
- Introducció als Sistemes Distribuïts
- Arquitectura de Microserveis
- Descomposició de Serveis i Bounded Contexts
- API Gateway, Service Discovery i Comunicació entre Serveis
- Patrons de Resiliència: Circuit Breaker, Retry i Bulkhead
- El Teorema CAP i la Consistència de Dades
Mòdul 5: Arquitectures Dirigides per Esdeveniments i Missatgeria
- Fonaments de l'Arquitectura Orientada a Esdeveniments
- Missatgeria Asíncrona: Cues i Brokers
- Patrons d'Esdeveniments: Event Sourcing i CQRS
- Gestió de Transaccions Distribuïdes: Patró Saga
- Streaming de Dades en Temps Real
Mòdul 6: Disseny Dirigit pel Domini (DDD)
- Conceptes Fonamentals del DDD
- Disseny Estratègic: Bounded Contexts i Llenguatge Ubic
- Disseny Tàctic: Entitats, Agregats i Repositoris
- Mapatge de Contextos (Context Mapping)
Mòdul 7: Dades i Persistència
- Estratègies de Persistència: SQL vs NoSQL
- Patrons d'Accés a Dades: Repository, Unit of Work i DAO
- Base de Dades per Servei i Gestió de Dades Distribuïdes
- Cau i Estratègies d'Invalidació
Mòdul 8: Arquitectura al Núvol i Desplegament
- Fonaments del Cloud Computing (IaaS, PaaS, SaaS)
- Contenidors i Orquestració amb Docker i Kubernetes
- Arquitectura Serverless
- Patrons de Disseny Cloud-Native
- Infraestructura com a Codi (IaC)
Mòdul 9: Qualitat, Seguretat i Observabilitat
- Escalabilitat: Horitzontal vs Vertical i Balanceig de Càrrega
- Alta Disponibilitat i Tolerància a Fallades
- Seguretat per Disseny i Autenticació/Autorització
- Observabilitat: Logging, Mètriques i Traçabilitat
- Rendiment i Proves de Càrrega
