Patrones de eventos
Kafka funciona mejor cuando los eventos se disenan como contratos de negocio, no como dumps accidentales de tablas.
Evento de negocio
Un evento de negocio representa algo que ya ocurrio.
Ejemplos:
OrderCreated
PaymentAuthorized
UserRegistered
ShipmentDeliveredUsa pasado: el evento no pide hacer algo, informa de algo ocurrido.
Comando vs evento
Comando:
CreateOrderEvento:
OrderCreatedLos comandos expresan intencion. Los eventos expresan hechos.
Event envelope
Estructura recomendada:
{
"event_id": "evt_001",
"event_type": "OrderCreated",
"occurred_at": "2026-06-26T10:00:00Z",
"producer": "orders-service",
"schema_version": 1,
"payload": {
"order_id": "ord_123",
"customer_id": "cus_456"
}
}Outbox pattern
Problema: guardar en base de datos y publicar en Kafka no es atomico si son dos sistemas separados.
Solucion:
sequenceDiagram
participant API as Orders API
participant DB as Database
participant W as Outbox worker
participant K as Kafka
API->>DB: Save order + outbox event in same transaction
W->>DB: Read pending outbox
W->>K: Publish event
W->>DB: Mark publishedIdempotent consumer
Un consumidor puede recibir duplicados. Usa event_id:
Si event_id ya fue procesado, ignorar.
Si no, procesar y guardar event_id.Dead letter topic
Usa DLT para eventos que no pueden procesarse:
orders.created.dltIncluye:
- Error.
- Consumer.
- Fecha.
- Intentos.
- Payload o referencia segura.
Retry topics
Para errores temporales:
orders.created.retry.1m
orders.created.retry.10m
orders.created.dltEvita reintentar infinitamente en el topic principal.
Event-carried state transfer
El evento contiene suficiente informacion para que consumidores no tengan que llamar al productor.
Ventaja:
- Menos acoplamiento.
Coste:
- Eventos mas grandes.
- Versionado mas importante.
CDC
Change Data Capture publica cambios de base de datos.
Util para integrar sistemas, pero no siempre equivale a eventos de negocio. Un cambio de fila no explica necesariamente la intencion de negocio.
Buenas practicas
- Nombra eventos en pasado.
- Incluye
event_id,occurred_at,producery version. - Disena consumidores idempotentes.
- Usa outbox cuando necesitas consistencia entre DB y Kafka.
- Separa retries de errores definitivos.
- No conviertas Kafka en llamada RPC disfrazada.
