Cuando los datos se reparten y replican entre varios nodos, surge una pregunta fundamental: ¿podemos garantizar a la vez que todas las lecturas vean el dato más reciente, que el sistema responda siempre y que tolere fallos de red? El Teorema CAP demuestra que no: hay que elegir. Comprender esta concesión es esencial para diseñar el almacenamiento de datos de cualquier sistema distribuido, y para elegir correctamente entre las decenas de bases de datos disponibles hoy.
En esta lección estudiaremos el Teorema CAP, su refinamiento PACELC, la diferencia entre consistencia fuerte y eventual, y clasificaremos las bases de datos más comunes según las garantías que ofrecen.
Contenido
- Las tres propiedades: C, A y P
- El enunciado del Teorema CAP
- Por qué P no es opcional en la práctica
- CP frente a AP: la elección real
- PACELC: más allá de CAP
- Consistencia fuerte frente a eventual
- Tabla de bases de datos según CAP
- Errores comunes y consejos
- Ejercicios
- Conclusión
- Las tres propiedades: C, A y P
El Teorema CAP, formulado por Eric Brewer, habla de tres propiedades de un sistema de datos distribuido:
| Propiedad | Significado |
|---|---|
| C — Consistencia | Toda lectura devuelve la escritura más reciente o un error. Todos los nodos ven el mismo dato a la vez. |
| A — Disponibilidad | Toda petición recibe una respuesta (no error), aunque pueda no ser el dato más reciente. |
| P — Tolerancia a particiones | El sistema sigue funcionando pese a que se pierdan mensajes entre nodos (una "partición" de red). |
Cuidado: la "Consistencia" de CAP no es la "C" de ACID. Aquí significa que todas las réplicas coinciden, no la integridad transaccional.
- El enunciado del Teorema CAP
El teorema afirma:
En presencia de una partición de red, un sistema distribuido solo puede garantizar dos de las tres propiedades: o consistencia, o disponibilidad, pero no ambas.
graph TD
CAP[Teorema CAP] --> C[Consistencia]
CAP --> A[Disponibilidad]
CAP --> P[Tolerancia a particiones]
C -.- nota["Ante una partición:<br/>elige C o A"]
A -.- notaImagina dos nodos replicados que dejan de comunicarse (partición). Llega una escritura a uno de ellos. Ahora una lectura llega al otro nodo, que no tiene esa escritura. El sistema debe decidir:
- Devolver el dato viejo (mantiene la disponibilidad, sacrifica la consistencia).
- Rechazar la lectura o esperar (mantiene la consistencia, sacrifica la disponibilidad).
No hay tercera opción. Por eso CAP es una elección, no un buffet.
- Por qué P no es opcional en la práctica
Mucha gente cree que puede elegir "CA" (consistencia y disponibilidad, renunciando a P). En un sistema realmente distribuido esto es una ilusión: las particiones de red ocurren (cables que se cortan, conmutadores que fallan, latencias extremas). No puedes garantizar que nunca habrá una partición.
Por tanto, en un sistema distribuido la P es obligatoria, y la elección real se reduce a:
- CP: ante una partición, priorizo la consistencia (puedo dejar de responder).
- AP: ante una partición, priorizo la disponibilidad (puedo devolver datos viejos).
Un sistema "CA" solo tiene sentido en una única máquina (una base de datos relacional clásica en un solo servidor), donde no hay red que particionar.
- CP frente a AP: la elección real
La decisión depende del caso de negocio:
| Escenario | Elección | Razón |
|---|---|---|
| Saldo bancario, stock crítico | CP | Mejor un error que un dato incorrecto. |
| Carrito de la compra, catálogo | AP | Mejor responder algo que caer. |
| Reserva de plazas limitadas | CP | No queremos vender dos veces lo mismo. |
| Contador de visitas, "me gusta" | AP | Un pequeño desfase es irrelevante. |
graph LR
P[Hay partición de red] --> D{¿Qué priorizo?}
D -->|Consistencia| CP[CP: rechazo o espero<br/>para no dar datos erróneos]
D -->|Disponibilidad| AP[AP: respondo con<br/>posible dato desactualizado]La pregunta guía siempre es: ¿qué es peor para mi negocio, dar una respuesta incorrecta o no dar respuesta?
- PACELC: más allá de CAP
CAP solo habla de qué pasa durante una partición, que es algo poco frecuente. PACELC, formulado por Daniel Abadi, completa el cuadro añadiendo qué pasa el resto del tiempo:
Partition: Availability o Consistency; Else (en operación normal): Latency o Consistency.
En otras palabras:
- Si hay Partición → eliges entre A y C (como en CAP).
- Si no la hay (Else) → aun así eliges entre Latencia y Consistencia, porque garantizar consistencia fuerte entre réplicas exige coordinación, que cuesta tiempo.
| Sistema | Clasificación PACELC | Lectura |
|---|---|---|
| Cassandra | PA/EL | Prioriza disponibilidad y baja latencia. |
| MongoDB | PA/EC (configurable) | Disponible en partición, consistente en operación normal. |
| Sistemas con consenso fuerte | PC/EC | Priorizan consistencia siempre, a costa de latencia. |
PACELC es más útil que CAP en el día a día, porque la mayor parte del tiempo no hay particiones, y aun así pagas un precio por la consistencia.
- Consistencia fuerte frente a eventual
| Modelo | Garantía | Coste | Cuándo usarlo |
|---|---|---|---|
| Fuerte | Toda lectura ve la última escritura. | Mayor latencia, menor disponibilidad. | Dinero, stock, reservas. |
| Eventual | Las réplicas convergen "con el tiempo". | Posibles lecturas desfasadas. | Catálogos, contadores, feeds. |
La consistencia eventual no significa "datos incorrectos para siempre", sino que, si dejan de llegar escrituras, todas las réplicas acaban coincidiendo. Existen niveles intermedios útiles, como read-your-own-writes (un usuario siempre ve sus propios cambios).
-- En Cassandra, el nivel de consistencia se elige por consulta.
-- QUORUM: confirma en la mayoría de réplicas (equilibrio).
CONSISTENCY QUORUM;
INSERT INTO polizas (id, ramo) VALUES ('POL-00123', 'hogar');
-- ONE: confirma con una sola réplica (rápido, menos consistente).
CONSISTENCY ONE;
SELECT * FROM polizas WHERE id = 'POL-00123';Lo interesante de sistemas como Cassandra es que ajustas la consistencia por operación: escrituras críticas con QUORUM, lecturas tolerantes con ONE. Si lecturas y escrituras suman más réplicas que el total (W + R > N), obtienes consistencia fuerte sobre un sistema base AP.
- Tabla de bases de datos según CAP
Una clasificación orientativa (muchas son configurables y pueden moverse de categoría):
| Base de datos | Tipo | CAP típico | Notas |
|---|---|---|---|
| PostgreSQL / MySQL (un nodo) | Relacional | CA | Sin partición real al ser un solo nodo. |
| MongoDB | Documental | CP (por defecto) | Prioriza consistencia; configurable. |
| HBase | Columnar | CP | Construida sobre HDFS, consistente. |
| Redis (clúster) | Clave-valor | CP | Coherencia sobre disponibilidad. |
| Cassandra | Columnar | AP | Consistencia ajustable por consulta. |
| DynamoDB | Clave-valor | AP (configurable) | Eventual por defecto, fuerte opcional. |
| Riak | Clave-valor | AP | Pensada para alta disponibilidad. |
| CouchDB | Documental | AP | Replicación y resolución de conflictos. |
Toma esta tabla como guía, no como dogma: la configuración concreta (factores de replicación, niveles de consistencia) determina el comportamiento real.
Errores Comunes y Consejos
- Confundir la C de CAP con la C de ACID: en CAP es "todas las réplicas coinciden"; en ACID es "integridad transaccional". No son lo mismo.
- Creer que puedes elegir CA en un sistema distribuido: las particiones ocurren; debes elegir entre CP y AP.
- Aplicar consistencia fuerte a todo: encarece latencia y reduce disponibilidad sin necesidad. Reserva la fuerte para datos críticos.
- Ignorar PACELC: el coste de la consistencia se paga también cuando NO hay particiones, en forma de latencia.
- Elegir base de datos por moda: elige según las garantías que tu caso de negocio necesita, no por la tecnología más sonada.
Ejercicios
- Enuncia el Teorema CAP y explica por qué, en un sistema distribuido real, la elección práctica se reduce a CP o AP.
- Para cada caso, indica si elegirías consistencia fuerte (CP) o eventual (AP) y justifica: (a) saldo de una cuenta bancaria, (b) número de "me gusta" de una publicación, (c) reserva de una butaca en un cine.
- Explica qué aporta PACELC frente a CAP y qué significa la clasificación "PA/EL".
Soluciones
-
CAP dice que, ante una partición de red, un sistema distribuido solo puede garantizar dos de las tres propiedades (C, A, P). Como las particiones son inevitables en un sistema realmente distribuido, P es obligatoria; por tanto, la elección real es entre CP (sacrificar disponibilidad para mantener consistencia) y AP (sacrificar consistencia para mantener disponibilidad).
-
(a) CP/fuerte: un saldo incorrecto es inaceptable; mejor un error que un dato erróneo. (b) AP/eventual: un desfase momentáneo en los "me gusta" es irrelevante; prima responder siempre. (c) CP/fuerte: no podemos vender la misma butaca dos veces, así que la consistencia manda.
-
PACELC añade qué ocurre cuando no hay partición: incluso entonces hay que elegir entre Latencia y Consistencia. "PA/EL" significa: ante una Partición prioriza la disponibilidad (A), y en operación normal (Else) prioriza la baja Latencia (a costa de consistencia). Es el perfil de sistemas como Cassandra.
Conclusión
Hemos aprendido que el Teorema CAP impone una concesión inevitable: ante una partición de red, hay que elegir entre consistencia (CP) y disponibilidad (AP). PACELC refina la idea recordando que, incluso sin particiones, pagamos en latencia por la consistencia. La elección entre consistencia fuerte y eventual, y la base de datos que la sustenta, deben responder siempre a las necesidades del negocio: ¿es peor una respuesta incorrecta o ninguna respuesta?
Con esta lección cerramos el Módulo 4, Arquitecturas Distribuidas y Microservicios. Has recorrido el camino completo: desde los fundamentos de los sistemas distribuidos y sus falacias, pasando por la descomposición en microservicios y bounded contexts, los mecanismos de comunicación, los patrones de resiliencia, hasta las concesiones de consistencia de datos. Estos conocimientos te permiten diseñar sistemas distribuidos robustos, conscientes de sus límites y adecuados a cada problema de negocio.
Curso de Arquitectura de Aplicaciones
Módulo 1: Fundamentos de la Arquitectura de Aplicaciones
- ¿Qué es la Arquitectura de Aplicaciones?
- El Rol del Arquitecto de Software
- Atributos de Calidad y Requisitos No Funcionales
- Decisiones Arquitectónicas y Compromisos (Trade-offs)
- Documentación de Arquitectura: Vistas y el Modelo C4
Módulo 2: Principios y Tácticas de Diseño
- Acoplamiento, Cohesión y Separación de Responsabilidades
- Principios SOLID Aplicados a la Arquitectura
- DRY, KISS, YAGNI y Otros Principios de Diseño
- Tácticas Arquitectónicas para los Atributos de Calidad
- Gestión de la Deuda Técnica
Módulo 3: Estilos y Patrones Arquitectónicos
- Arquitectura Monolítica
- Arquitectura en Capas (N-Tier)
- Arquitectura Cliente-Servidor
- Arquitectura Hexagonal (Puertos y Adaptadores)
- Arquitectura Limpia y Cebolla (Clean & Onion)
Módulo 4: Arquitecturas Distribuidas y Microservicios
- Introducción a los Sistemas Distribuidos
- Arquitectura de Microservicios
- Descomposición de Servicios y Bounded Contexts
- API Gateway, Service Discovery y Comunicación entre Servicios
- Patrones de Resiliencia: Circuit Breaker, Retry y Bulkhead
- El Teorema CAP y la Consistencia de Datos
Módulo 5: Arquitecturas Dirigidas por Eventos y Mensajería
- Fundamentos de la Arquitectura Orientada a Eventos
- Mensajería Asíncrona: Colas y Brokers
- Patrones de Eventos: Event Sourcing y CQRS
- Gestión de Transacciones Distribuidas: Patrón Saga
- Streaming de Datos en Tiempo Real
Módulo 6: Diseño Dirigido por el Dominio (DDD)
- Conceptos Fundamentales del DDD
- Diseño Estratégico: Bounded Contexts y Lenguaje Ubicuo
- Diseño Táctico: Entidades, Agregados y Repositorios
- Mapeo de Contextos (Context Mapping)
Módulo 7: Datos y Persistencia
- Estrategias de Persistencia: SQL vs NoSQL
- Patrones de Acceso a Datos: Repository, Unit of Work y DAO
- Base de Datos por Servicio y Gestión de Datos Distribuidos
- Caché y Estrategias de Invalidación
Módulo 8: Arquitectura en la Nube y Despliegue
- Fundamentos del Cloud Computing (IaaS, PaaS, SaaS)
- Contenedores y Orquestación con Docker y Kubernetes
- Arquitectura Serverless
- Patrones de Diseño Cloud-Native
- Infraestructura como Código (IaC)
Módulo 9: Calidad, Seguridad y Observabilidad
- Escalabilidad: Horizontal vs Vertical y Balanceo de Carga
- Alta Disponibilidad y Tolerancia a Fallos
- Seguridad por Diseño y Autenticación/Autorización
- Observabilidad: Logging, Métricas y Trazabilidad
- Rendimiento y Pruebas de Carga
