← 🌊 Streaming
intermedio

4.3 · Arquitecturas Lambda y Kappa

⏱ 25 minMódulo 4: Streaming e Ingesta de Datos

El problema que resuelven

Queremos dos cosas a la vez que parecen contradictorias:

  • Resultados exactos y completos sobre todo el histórico (lo que batch hace bien).
  • Resultados frescos, con segundos de retraso como máximo (lo que streaming hace bien).

¿Cómo tener ambas? Las arquitecturas Lambda y Kappa son dos respuestas distintas a esta pregunta.

Arquitectura Lambda

Propuesta por Nathan Marz, la arquitectura Lambda combina dos rutas de procesamiento en paralelo sobre los mismos datos:

  1. Batch layer (capa batch): almacena el dataset maestro inmutable y recalcula periódicamente (cada hora, cada noche) las vistas batch sobre todos los datos. Es exacta pero lenta.
  2. Speed layer (capa de velocidad): procesa en streaming solo los datos recientes —los que aún no cubre la última vista batch— produciendo vistas en tiempo real. Es rápida pero aproximada.
  3. Serving layer (capa de servicio): responde las consultas combinando la vista batch con la vista incremental: consulta = vista_batch + vista_tiempo_real.
graph TD
F["Fuentes de datos<br/>(eventos)"] --> IM["Datos inmutables<br/>(dataset maestro)"]
IM --> BL["Batch layer<br/>recalcula todo<br/>periódicamente"]
F --> SL["Speed layer<br/>procesa lo reciente<br/>en streaming"]
BL --> BV["Vistas batch<br/>(exactas, antiguas)"]
SL --> RV["Vistas en tiempo real<br/>(aproximadas, frescas)"]
BV --> SV["Serving layer"]
RV --> SV
SV --> Q["Consultas<br/>batch + tiempo real"]
Arquitectura Lambda: dos rutas paralelas (batch y speed) cuyas vistas se combinan en la capa de servicio.

Un ejemplo clásico: contar las visitas por página. La batch layer recalcula cada noche los totales históricos exactos; la speed layer mantiene un contador incremental con lo ocurrido desde medianoche; la serving layer suma ambos.

Ventajas y desventajas de Lambda

VentajasDesventajas
Resultados exactos sobre todo el históricoDos bases de código (batch y streaming) que deben dar el mismo resultado
La batch layer corrige los errores de la speed layer en cada recomputaciónDoble operación y mantenimiento: cada cambio de lógica se hace dos veces
Tolerancia a fallos humanos: al recomputar desde datos inmutables se arreglan bugsComplejidad en la reconciliación de vistas

La crítica habitual a Lambda: la lógica de negocio duplicada en dos frameworks distintos (por ejemplo, Spark batch y Flink streaming) tiende a divergir con el tiempo.

Arquitectura Kappa

Propuesta por Jay Kreps (cocreador de Kafka), Kappa plantea una simplificación radical: todo es un stream. Solo hay una capa:

  • Todos los datos entran como un flujo de eventos en un log inmutable y durable (típicamente Kafka) con retención larga.
  • Un único motor de stream processing mantiene las vistas actualizadas continuamente.
  • Si cambia la lógica o hay que corregir un bug, se hace replay: se relanza el procesamiento leyendo el log desde el principio (offset 0) hacia unas vistas nuevas, y se cambia el puntero cuando estén listas.
graph TD
F["Fuentes de datos<br/>(eventos)"] --> LOG["Log inmutable<br/>(Kafka, retencion larga)"]
LOG --> SP["Stream processing<br/>(una sola logica)"]
SP --> V["Vistas materializadas"]
V --> Q["Consultas"]
LOG -. "replay desde<br/>offset 0 si cambia<br/>la logica" .-> SP2["Nueva version del<br/>stream processing"]
SP2 --> V2["Vistas nuevas"]
V2 --> Q
Arquitectura Kappa: una sola capa de streaming sobre un log durable; el replay desde el inicio sustituye a la batch layer.

La idea clave de Kappa: una batch layer no es más que un stream job que lee un stream “muy largo”. Si tu log guarda todo el histórico, no necesitas una capa aparte.

Ventajas y desventajas de Kappa

VentajasDesventajas
Una sola base de código y un solo frameworkEl log debe retener todo el histórico: almacenamiento caro
No hay reconciliación: una sola fuente de resultadosRecomputar todo el histórico (replay) puede ser muy costoso
Modelo mental simple: todo es un streamNo todos los cálculos se expresan de forma natural como streaming (joins complejos, ML batch)

¿Cuándo elegir cada una?

SituaciónRecomendación
Lógica batch y tiempo real muy distintas, o algoritmos que solo funcionan en batchLambda
La misma lógica sirve para datos históricos y en vivoKappa
El equipo domina un solo stack de streaming (Flink, Spark Structured Streaming)Kappa
Volumen de histórico enorme y recomputarlo todo es prohibitivoLambda (batch sobre almacenamiento barato)
Correcciones frecuentes de lógica con necesidad de replay rápidoKappa (con particionado suficiente para recompute rápido)

En la práctica, con motores modernos como Flink o Spark Structured Streaming —que ejecutan el mismo código en modo batch y streaming— la frontera se difumina y muchas organizaciones se inclinan por Kappa.

Ejercicio: reconciliar batch layer + speed layer

🧪 Ejercicio

Vista batch + vista incremental

Simula la reconciliación de una arquitectura Lambda. Tienes `historico` (eventos antiguos ya procesados por la batch layer) y `recientes` (eventos llegados después de la última recomputación). Implementa: 1) `vista_batch(eventos)` que cuente eventos por categoría, 2) `vista_speed(eventos)` igual pero sobre los recientes, y 3) `consultar(vb, vs)` que combine ambas sumando conteos. Muestra la vista final y comprueba que coincide con contar todo junto.

Comprueba lo aprendido

Comprueba que lo pillaste

En una arquitectura Lambda, ¿qué capa corrige las posibles aproximaciones o errores de la speed layer?

Comprueba que lo pillaste

¿Qué necesita la arquitectura Kappa para poder prescindir de la batch layer?

Comprueba que lo pillaste

¿Cuál es la principal crítica operativa a la arquitectura Lambda?

Resumen

  • Lambda combina una batch layer (exacta, sobre todo el histórico), una speed layer (fresca, sobre lo reciente) y una serving layer que reconcilia ambas vistas.
  • Su coste principal es mantener dos implementaciones de la misma lógica.
  • Kappa simplifica a una sola capa de streaming sobre un log durable; el replay desde el offset 0 sustituye a la batch layer.
  • Kappa exige retener todo el histórico en el log y que la lógica sea expresable como streaming.
  • La elección depende del volumen del histórico, del stack del equipo y de si la lógica batch y streaming son realmente la misma.

📚 Lecturas y fuentes

RecursoTipoPor qué leerlo
Macrodatos (Wikipedia en español)ArtículoPara situar estas arquitecturas en el panorama general: lee solo la sección “Arquitectura”.
Questioning the Lambda Architecture (Jay Kreps, 2014)ArtículoEl texto que propuso Kappa. Corto y polémico: léelo entero, es la fuente directa de la crítica a Lambda que vimos. (en inglés)
Lambda architecture (Wikipedia en inglés)ArtículoDescripción neutral de las tres capas y un resumen de las críticas. Lee “Batch layer”, “Speed layer”, “Serving layer” y “Criticism”. (en inglés)
Event Sourcing (Martin Fowler)ArtículoEl patrón que hace posible el replay de Kappa. Lee “How it Works” y “When to Use It”; los ejemplos en Java son opcionales. (en inglés)