README · by ansango
← Volver al libro

Trade-offs in data systems architecture

El marco que vertebra todo el libro: operacional vs analítico, data warehousing, cloud vs self-hosting, single-node vs distribuido. Por qué no hay respuestas universales

~7 min de lectura
Resumen

DDIA abre con un capítulo que enmarca las decisiones del resto del libro. La idea central: en sistemas de datos todo es un trade-off. No existe “la mejor base de datos”, sino “la base de datos apropiada para tu caso”. Esta nota recorre los grandes ejes de decisión: operacional vs analítico, cloud vs self-hosting, single-node vs distribuido, microservices vs monolito.

Por qué no hay respuestas universales

Kleppmann y Riccomini arrancan con la observación más importante del libro: “It depends”. Para cada decisión de arquitectura hay un trade-off, y el trade-off correcto depende del contexto. La tarea del ingeniero de datos no es recordar la respuesta correcta, sino:

  1. Identificar los trade-offs en juego.
  2. Evaluar cuál pesa más en tu caso.
  3. Decidir con criterio.
  4. Documentar la decisión para futuros colegas.
Cada decisión de arquitectura tiene la estructura:

                ┌─────────────────────┐
                │   PROBLEMA A        │
                │   RESOLVER          │
                └──────────┬──────────┘

            ┌──────────────┴──────────────┐
            ▼                             ▼
     ┌─────────────┐               ┌─────────────┐
     │  OPCIÓN A   │               │  OPCIÓN B   │
     │  (fuerte en)│               │  (fuerte en)│
     │  (débil en) │               │  (débil en) │
     └─────────────┘               └─────────────┘
            │                             │
            └──────────────┬──────────────┘

                ┌─────────────────────┐
                │  NUESTRA DECISIÓN   │
                │  (con justificación)│
                └─────────────────────┘
No es cobardía

Decir “depende” no es noResponder. Es responder con el marco correcto: identificar qué se pierde, qué se gana, qué se asume. Esa es la disciplina del ingeniero.

Operacional vs analítico

El primer eje de decisión es el tipo de carga que va a soportar el sistema:

Sistemas operacionales (OLTP)

Sistemas analíticos (OLAP)

OLTP vs OLAP:

                    OLTP                           OLAP
                 ┌──────────┐                   ┌───────────┐
Usuarios:        │ Millones │                   │ Decenas   │
Consultas:       │ Muchas   │                   │ Pocas     │
Tamaño:          │ Pequeñas │                   │ Grandes   │
Latencia:        │ 1-100 ms │                   │ 1-60 min  │
Datos:           │ Actuales │                   │ Históricos│
Uso:             │ Transacc.│                   │ Análisis  │
Fuente:          │ Eventos  │                   │ Agregados │
Mezclar cargas es el error clásico

Si intentas servir consultas analíticas sobre una base OLTP, ambas sufren. La base se satura con escaneos masivos, y las operaciones diarias se ralentizan. La separación entre sistemas operacionales y analíticos es la razón de ser del data warehouse.

Data warehousing

Un data warehouse es una base de datos dedicada a analítica. Su función es separar la carga analítica de la operacional. El patrón típico:

┌─────────────────┐
│  OLTP systems   │ (Postgres, MongoDB, etc.)
│  (producción)   │
└────────┬────────┘
         │ ETL/ELT
         │ (extract → load → transform)

┌─────────────────┐
│  DATA WAREHOUSE │ (BigQuery, Snowflake, Redshift)
└────────┬────────┘


┌─────────────────┐
│  BI / analytics │ (Tableau, Looker, dashboards)
└─────────────────┘

ETL vs ELT

Dos variantes del flujo:

Sistemas de record vs derived data

El libro introduce una distinción que recorre toda la wiki: datos de record vs datos derivados.

Datos de record (system of record)

-- Tabla de clientes (datos de record)
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT NOW(),
    -- no hay updated_at a propósito:
    -- un cliente actualizado es un cliente nuevo
    -- (o se conserva la historia en una tabla aparte)
);

Datos derivados (derived data)

-- Vista materializada: derived data
CREATE MATERIALIZED VIEW daily_sales AS
SELECT
    date_trunc('day', created_at) AS day,
    SUM(amount) AS total
FROM orders
GROUP BY day;
La asimetría

Los datos de record son insustituibles: si los pierdes, los pierdes. Los datos derivados son descartables: si los pierdes, los puedes regenerar. Es fundamental saber cuál es cuál en cada tabla.

Cloud vs self-hosting

El libro dedica una sección importante a la comparación. La decisión ha evolucionado mucho desde la primera edición:

Self-hosting

Cuándo tiene sentido:

Coste oculto: contratar personas expertas, mantener on-call, hacer backups, gestionar fallos.

Cloud services

Cuándo tiene sentido:

Coste oculto: dependencia del proveedor, precios que pueden subir, capacidades limitadas por lo que el proveedor ofrece.

Self-hosting            vs.            Cloud
─────────────                          ──────
Coste fijo                              Coste variable
Control total                          Control limitado
Operación pesada                       Operación delegable
Vendor lock-in: hardware               Vendor lock-in: API
Personas expertas necesarias            MenosOperations
Predecible                             Sorprendente
“Cloud native” no es “mejor”

El libro es agnóstico. La decisión depende del negocio, no de la moda. Hay sistemas excelentes auto-hospedados y hay sistemas excelentes en cloud. Lo que cuenta es la economía y la organización.

Cloud native architecture

Kleppmann describe la cloud native architecture como un estilo que asume cloud:

Pros y contras del cloud

El libro enumera con cuidado:

Pros:

Contras:

Distribuido vs single-node

El libro aborda uno de los debates más importantes: ¿cuándo vale la pena distribuir?

Single-node systems

Sorprendentemente actuales. Kleppmann destaca:

“La distribución es un coste, no un beneficio.”

No se distribuye porque sí. Se distribuye cuando la escala excede lo que un solo servidor puede manejar.

Cuándo distribuir

Distributed systems don’t exist

El libro toma prestada esta frase provocadora: en la práctica, no construimos sistemas distribuidos, ejecutamos redes de sistemas single-node que cooperan. La red no es confiable. La coordinación entre nodos es lenta. Los fallos son parciales.

Arquitectura típica "distribuida":

┌──────────┐    ┌──────────┐    ┌──────────┐
│ Nodo 1  │◄──►│ Nodo 2  │◄──►│ Nodo 3  │
│ single  │    │ single  │    │ single  │
└──────────┘    └──────────┘    └──────────┘
       │              │              │
       └──────────────┼──────────────┘

              RED (no confiable)
La red no es confiable

Esta es la observación fundamental del libro. Los sistemas distribuidos asumen que la red va a fallar. Por eso son complejos. Por eso los algoritmos tienen que tolerar fallos de comunicación. Por eso el consensus es difícil.

Microservices vs monolito

El libro discute la moda de los microservices con sano escepticismo:

Microservices

Monolito modular

El consejo del libro

Empieza con un monolito bien estructurado (módulos con interfaces claras). Dividir en microservicios solo cuando duela: cuando un equipo necesita desplegar independientemente, cuando una parte necesita escalar independientemente, cuando los límites organizativos lo exijan.

Microservices vs serverless

El libro introduce también el serverless como opción:

Cloud native y la era de la AI

La 2ª edición añade una reflexión sobre cómo la AI ha cambiado el panorama:

La IA no reemplaza los fundamentos

Aunque la IA cambia algunos componentes, los principios del libro (consistencia, escalabilidad, mantenibilidad) siguen siendo válidos. La AI no es una varita mágica que esquiva los problemas de siempre.

Resumen en tres frases

Próximos pasos