Saga

Coordina transacciones de larga duración entre servicios mediante pasos y compensaciones.

Contexto

Un proceso de negocio cruza varios servicios (Pago, Inventario, Envío). Las transacciones distribuidas (2PC) no escalan.

Problema

Sin un coordinador, no hay forma de revertir pasos parciales si algo falla a la mitad.

Solución

La Saga ejecuta una secuencia de pasos locales. Si uno falla, ejecuta sus compensaciones en orden inverso.

#Variantes

  • Orquestada: un coordinador central ordena cada paso.
  • Coreografiada: cada servicio reacciona a eventos de los demás.

#Ejemplo en C# — Saga orquestada

public class PlaceOrderSaga
{
    public async Task RunAsync(PlaceOrderCommand cmd)
    {
        var orderId = await _orders.CreateAsync(cmd);
        try
        {
            await _payments.ChargeAsync(orderId, cmd.Total);
            await _inventory.ReserveAsync(orderId, cmd.Items);
            await _shipping.ScheduleAsync(orderId);
        }
        catch
        {
            // Compensaciones en orden inverso
            await _shipping.CancelAsync(orderId);
            await _inventory.ReleaseAsync(orderId);
            await _payments.RefundAsync(orderId);
            await _orders.MarkFailedAsync(orderId);
            throw;
        }
    }
}
Tradeoffs
Pro Contra
Sin transacciones distribuidas Cada paso necesita su compensación
Estado de la saga es persistible y reanudable Diseñar compensaciones idempotentes es difícil

#extra #distributed #transaction