Outbox Pattern en C#: Guía Completa

Introducción: Consistencia entre BD y eventos

El patrón Outbox garantiza que los cambios en la base de datos y la publicación de eventos estén alineados.

En lugar de publicar directamente, se guarda el evento en una tabla Outbox dentro de la misma transacción que actualiza los datos.

Luego un proceso separado lee la Outbox y publica los eventos, evitando pérdidas si el broker falla.

Outbox
Prompt: Outbox table and event dispatcher, clean minimal style.

1. Naturaleza: Bandeja de salida

Cuando escribes una carta, la dejas en la bandeja de salida para asegurar que sea enviada.

Aunque el cartero falle hoy, la carta sigue allí hasta que se entregue. Eso es exactamente lo que hace la Outbox.

Bandeja
Prompt: Outbox tray with letters, soft illustration.

2. Mundo Real: Confirmación de pedidos

Un e-commerce confirma un pedido y debe notificar a otros servicios.

Si la base de datos se actualiza pero la notificación falla, el sistema queda inconsistente.

Con Outbox, la confirmación y el evento se guardan juntos, y la publicación ocurre de manera segura después.

Pedidos
Prompt: Order confirmation flow with outbox, clean flat style.

3. Implementación en C#: Código Paso a Paso

public class OutboxMessage
{
    public Guid Id { get; set; }
    public string Payload { get; set; }
    public DateTime CreatedAt { get; set; }
}

// En la misma transacción que el dominio
var message = new OutboxMessage { Id = Guid.NewGuid(), Payload = "PedidoCreado" };
// Guardar message en tabla Outbox

Un worker de fondo lee la tabla Outbox y publica al broker. Después marca el evento como enviado.

Este enfoque minimiza inconsistencias y evita pérdidas de mensajes ante fallos.

4. Outbox vs Publicación directa

La publicación directa es más simple, pero riesgosa: un fallo entre la BD y el broker rompe la consistencia.

Outbox agrega un paso extra, pero garantiza que ningún cambio se quede sin su evento.

5. Diagrama UML

UML Outbox
Prompt: UML diagram of Outbox pattern, clean vector layout.
Flujo Outbox
Prompt: Outbox publishing flow diagram, minimal infographic style.

⚠️ Cuándo NO Usar Outbox

  • Si la operación no requiere eventos distribuidos.
  • Si puedes tolerar inconsistencias temporales sin impacto.
  • Si el costo de un worker adicional no se justifica.

💪 Ejercicio

Implementa una tabla Outbox y un proceso que publique los eventos pendientes con reintentos.

Conclusión

Outbox es esencial para sistemas que necesitan consistencia entre datos y eventos.

Con este patrón, reduces fallos silenciosos y aumentas la confiabilidad del sistema.