Skip to content
SP StackPractices
intermediate

Teorema CAP y Trade-offs de Bases de Datos

Guía práctica del teorema CAP: consistencia, disponibilidad y tolerancia a particiones. Aprende a elegir los trade-offs correctos para tu aplicación.

Teorema CAP y Trade-offs de Bases de Datos

Introducción

El teorema CAP establece que un almacén de datos distribuido puede garantizar como máximo dos de estas tres propiedades: Consistencia, Disponibilidad y Tolerancia a Particiones. Dado que las particiones de red son inevitables, realmente estás eligiendo entre sistemas CP (Consistencia + Tolerancia a Particiones) y AP (Disponibilidad + Tolerancia a Particiones). Esta guía explica qué significa cada propiedad y cómo elegir el trade-off correcto.

Las Tres Propiedades

Consistencia (C)

Cada lectura recibe la escritura más reciente o un error. Todos los nodos ven los mismos datos al mismo tiempo.

Cliente escribe X=10 en Nodo A
Cliente lee X desde Nodo B → debe obtener 10 (o error)

Ejemplos: PostgreSQL, MongoDB (con majority write concern), etcd, ZooKeeper.

Disponibilidad (A)

Cada solicitud recibe una respuesta sin error, sin garantía de que contenga la escritura más reciente.

Cliente escribe X=10 en Nodo A (particionado de Nodo B)
Cliente lee X desde Nodo B → obtiene valor stale (ej: X=5)

Ejemplos: Cassandra, DynamoDB, Riak, Couchbase.

Tolerancia a Particiones (P)

El sistema continúa operando a pesar de particiones de red (nodos que no pueden comunicarse).

Realidad: La tolerancia a particiones no es opcional en sistemas distribuidos. Las redes fallan. Debes elegir CP o AP.

CP vs AP en la Práctica

Sistemas CP (Eligen Consistencia)

Cuándo ElegirEjemplos
Transacciones financierasSaldos bancarios, trading de acciones
Gestión de inventarioConteos de stock de e-commerce
Almacenes de configuraciónService discovery, feature flags
Elección de líderLocks distribuidos, coordinación de cluster

Trade-off: Si ocurre una partición, el sistema puede rechazar escrituras (sacrificando disponibilidad) para mantener consistencia.

Sistemas AP (Eligen Disponibilidad)

Cuándo ElegirEjemplos
Feeds de redes socialesTimeline de Twitter, feed de Facebook
Analytics y métricasDatos de series de tiempo, tracking de clicks
Almacenes de sesionesCaché de sesiones de usuarios
Entrega de contenidoCaches de CDN, réplicas de lectura

Trade-off: Si ocurre una partición, el sistema acepta escrituras en ambos lados de la partición, creando inconsistencia temporal que se resuelve después.

PACELC: Extendiendo CAP

CAP solo discute comportamiento durante una partición. PACELC agrega comportamiento cuando no hay partición:

SistemaDurante ParticiónOperación Normal
PA/ELDisponibleOptimizado para latencia (consistencia eventual)
PA/ECDisponibleOptimizado para consistencia
PC/ELConsistenteOptimizado para latencia
PC/ECConsistenteOptimizado para consistencia

Modelos de Consistencia

ModeloDescripciónEjemplo
FuerteTodas las lecturas ven la última escrituraPostgreSQL, etcd
CausalLas lecturas respetan relaciones causalesBase de datos COPS
SesiónLecturas en una sesión ven escrituras previasDynamoDB session consistency
Staleness acotadaLecturas están como máximo X segundos staleAzure Cosmos DB
EventualLas lecturas eventualmente convergenCassandra, S3

Ejemplos del Mundo Real

Checkout de E-Commerce

OperaciónConsistencia RequeridaElección
Verificar stockFuerte (no vender de más)CP — query nodo primario
Agregar al carritoSesiónAP — cache con afinidad de sesión
Ver recomendacionesEventualAP — lectura desde cache
Procesar pagoFuerteCP — transacción ACID

Feed de Redes Sociales

OperaciónConsistencia RequeridaElección
Publicar tweetEventualAP — aceptar escritura, propagar async
Ver feedEventualAP — cacheado, puede estar segundos stale
Dar likeEventualAP — incrementar contador, reconciliar después
Eliminar cuentaFuerteCP — asegurar que todos los réplicas eliminen

Mejores Prácticas

  • No uses consistencia fuerte en todas partes — cuesta latencia y disponibilidad
  • Identifica tus requerimientos de consistencia por operación — no todos los datos necesitan las mismas garantías
  • Usa patrones saga para transacciones distribuidas — no fuerces ACID entre servicios
  • Diseña para idempotencia — la consistencia eventual significa reintentos, y los reintentos significan duplicados
  • Monitorea lag de replicación — el lag es la distancia entre “escrito” y “visible en todas partes”

Errores Comunes

  • Tratar todos los datos como si necesitaran consistencia fuerte — la mayoría de datos de aplicación está bien con eventual
  • Construir sistemas distribuidos sin entender los trade-offs — lleva a fallas impredecibles
  • Asumir que “distribuido” significa “más consistente” — usualmente es lo opuesto
  • Usar una base CP para una carga de trabajo AP (o viceversa) — empareja la herramienta al requerimiento
  • Ignorar lag de replicación en escenarios read-after-write — los usuarios pueden no ver sus propias escrituras inmediatamente

Preguntas Frecuentes

¿Es posible tener las tres propiedades CAP?

No. El teorema es una prueba matemática: en presencia de una partición de red, debes elegir entre consistencia y disponibilidad. Ningún sistema distribuido puede garantizar las tres simultáneamente.

¿CAP significa que no puedo tener consistencia y disponibilidad?

No. Cuando no hay partición, puedes tener ambas. El trade-off solo aplica durante una partición. Muchos sistemas son CA (consistentes y disponibles) bajo condiciones normales y se vuelven CP o AP solo durante fallas.

¿Cómo elijo entre CP y AP?

Pregunta: “¿Qué duele más — una escritura fallida o datos stale?” Si escrituras fallidas son inaceptables (pagos, inventario), elige CP. Si datos stale son aceptables (feeds, analytics), elige AP. La mayoría de sistemas usa una mezcla: CP para paths críticos, AP para todo lo demás.