Saga Pattern en C#: Guía Completa

Introducción: Transacciones distribuidas

El patrón Saga coordina una serie de pasos distribuidos con acciones de compensación si algo falla.

En lugar de un commit global, cada servicio confirma su paso y publica eventos. Si ocurre un error, se ejecutan compensaciones.

Esto permite consistencia eventual sin bloquear todo el sistema.

Saga
Prompt: Saga flow with forward and compensating steps, clean minimal style.

1. Naturaleza: Dominó con reversa

Imagina una fila de fichas de dominó que puedes revertir si algo falla.

En una Saga, cada paso tiene un “anti-paso” para deshacer la operación cuando sea necesario.

Dominó
Prompt: Domino chain with undo arrows, soft illustration.

2. Mundo Real: Reserva de viaje

Reservas vuelo, luego hotel y luego auto. Si el hotel falla, debes cancelar el vuelo.

Las cancelaciones son compensaciones. Cada servicio maneja su propia lógica de reversa.

La Saga asegura que el sistema no quede en un estado inconsistente.

Viaje
Prompt: Travel booking flow with compensations, clean flat style.

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

public class SagaState { public bool PagoOk; public bool StockOk; }

public class OrderSaga
{
    public SagaState State = new();

    public void OnPagoConfirmado() => State.PagoOk = true;
    public void OnStockReservado() => State.StockOk = true;

    public void CompensarPago() { /* revertir */ }
    public void CompensarStock() { /* revertir */ }
}

Una Saga puede ser orquestada (con coordinador) o coreografiada (por eventos).

Lo importante es definir claramente los pasos y sus compensaciones.

4. Saga vs 2PC

2PC bloquea recursos hasta completar la transacción global. Saga no bloquea, pero acepta consistencia eventual.

Si necesitas alta disponibilidad, Saga suele ser mejor opción.

5. Diagrama UML

UML Saga
Prompt: UML diagram of saga pattern, clean vector layout.
Flujo Saga
Prompt: Saga compensation flow diagram, minimal infographic style.

⚠️ Cuándo NO Usar Saga

  • Si necesitas transacciones ACID estrictas.
  • Si las compensaciones son imposibles o demasiado costosas.
  • Si el dominio es simple y no requiere distribución.

💪 Ejercicio

Define una Saga para un pedido: pago, inventario, envío. Especifica las compensaciones.

Conclusión

Saga es el patrón clave para transacciones distribuidas en microservicios.

Con pasos claros y compensaciones bien diseñadas, logras consistencia eventual sin sacrificar disponibilidad.