Skip to content

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:

txt
OrderCreated
PaymentAuthorized
UserRegistered
ShipmentDelivered

Usa pasado: el evento no pide hacer algo, informa de algo ocurrido.

Comando vs evento

Comando:

txt
CreateOrder

Evento:

txt
OrderCreated

Los comandos expresan intencion. Los eventos expresan hechos.

Event envelope

Estructura recomendada:

json
{
  "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:

mermaid
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 published

Idempotent consumer

Un consumidor puede recibir duplicados. Usa event_id:

txt
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:

txt
orders.created.dlt

Incluye:

  • Error.
  • Consumer.
  • Fecha.
  • Intentos.
  • Payload o referencia segura.

Retry topics

Para errores temporales:

txt
orders.created.retry.1m
orders.created.retry.10m
orders.created.dlt

Evita 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, producer y 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.