Kafka como Log Distribuido Inmutable: El Concepto Fundamental
Kafka NO es una cola de mensajes tradicional. Es un log distribuido, inmutable y ordenado (commit log). Cada mensaje publicado se persiste en disco de forma secuencial, asignándole un offset numérico que nunca cambia. Los consumidores leen mensajes indicando desde qué offset quieren empezar, y pueden releer eventos pasados las veces que necesiten.
En una línea kafkaTemplate.send("ordenes-creadas", ordenId.toString(), new OrdenCreadaEvent(ordenId, items));
# Crear un topic con 6 particiones y retención de 7 días
kafka-topics.sh --bootstrap-server localhost:9092 --create \
--topic tareas.eventos --partitions 6 --replication-factor 3 \
--config retention.ms=604800000
# Leer desde el principio mostrando partición, offset y clave
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic tareas.eventos \
--from-beginning --property print.partition=true \
--property print.offset=true --property print.key=true
# Dónde está cada consumer group y cuánto retraso (lag) acumula
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group notificaciones
# Reprocesar: mover el grupo al inicio (con los consumidores parados)
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group notificaciones \
--topic tareas.eventos --reset-offsets --to-earliest --execute
Cómo funciona por dentro
Kafka no es una cola de la que los mensajes desaparecen al leerlos. Es un log: una secuencia ordenada de registros a la que solo se añade al final. Cada registro tiene una posición numérica, el offset. Los consumidores no borran nada; cada uno recuerda hasta qué offset ha leído y avanza a su ritmo.
Los registros se conservan según la política de retención del topic (por tiempo, por ejemplo 7 días, o por tamaño), independientemente de si alguien los ha leído. Eso permite cosas imposibles en una cola clásica: que varios sistemas lean los mismos eventos de forma independiente, añadir un consumidor nuevo que reprocese el histórico o volver atrás tras corregir un bug moviendo el offset.
Los topics compactados (cleanup.policy=compact) conservan solo el último registro de cada clave, convirtiendo el topic en una tabla de estado actual que se puede reconstruir en cualquier momento.
Se conecta con Event SourcingReplicación de DatosAudit Trail