Hace un par de años escribía sobre cómo nuestro Data Warehouse chocó contra el muro del rendimiento y la pesadilla que suponía que los procesos ETL (Extracción, Transformación y Carga) tardaran toda la noche. Por mucho que hayamos optimizado el hardware, el problema base sigue ahí: el modelo "por lotes" (batch) significa que los datos siempre llegan con horas de retraso. Y hoy en día, por ejemplo, el departamento de marketing no quiere saber qué pasó ayer, quiere saber qué están clicando los usuarios ahora mismo.

Investigando cómo solucionar este problema de latencia, he topado con una herramienta nacida en las entrañas de LinkedIn que se ha convertido en el estándar de facto para el "streaming" de datos: Apache Kafka.

No es una simple cola de mensajes

Al principio, mi mente lo asimiló como un sistema de colas tradicional tipo RabbitMQ o ActiveMQ. "Un publicador manda un mensaje, la cola lo retiene y un consumidor lo lee y lo borra". Falso.

Kafka no es una cola, es un Log de Confirmación Distribuido (Distributed Commit Log). Los mensajes (eventos) se escriben en disco de forma secuencial al final de un archivo. Cuando un consumidor lee un mensaje, no se borra. Sigue ahí. Esto permite que el sistema de facturación y el sistema de fraude lean exactamente el mismo flujo de datos simultáneamente, cada uno a su ritmo.

A nivel de código, escribir un evento en Python es ridículamente fácil usando la librería kafka-python:

from kafka import KafkaProducer
import json

# Conectamos a nuestro clúster de Kafka
productor = KafkaProducer(
    bootstrap_servers=['kafka-nodo1:9092', 'kafka-nodo2:9092'],
    value_serializer=lambda v: json.dumps(v).encode('utf-8')
)

# Simulamos un evento capturado en nuestra web
evento_clic = {
    "id_usuario": 84752,
    "accion": "añadir_carrito",
    "id_producto": "ZAP-405",
    "timestamp": "2016-05-14T10:15:30Z"
}

# Mandamos el evento al "topic" (tema) llamado 'clicks_web'
productor.send('clicks_web', value=evento_clic)

# Forzamos el envío asíncrono
productor.flush()
print("Evento inyectado en el torrente circulatorio.")

La magia del rendimiento de Kafka (capaz de procesar millones de mensajes por segundo) radica en cómo trata el disco duro. En lugar de hacer búsquedas aleatorias, hace escrituras secuenciales brutales y utiliza técnicas de "Zero-Copy" a nivel de sistema operativo para mover datos directamente del disco a la tarjeta de red sin pasar por la aplicación.

Reflexión: La base de datos invertida

Kafka propone un cambio de paradigma arquitectónico. Hasta ahora, la Base de Datos Relacional era el "Sistema de la Verdad", y de ahí sacábamos los datos.

Con Kafka, la arquitectura se invierte. El "Log de Eventos" inmutable que fluye por Kafka se convierte en el origen absoluto de la verdad. Los datos ya no descansan pasivamente en tablas esperando ser consultados; los datos están en constante movimiento.