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