CodeGym /Cursos /Módulo 5. Spring /Lección 214: Aplicación de sagas para gestionar procesos ...

Lección 214: Aplicación de sagas para gestionar procesos de negocio

Módulo 5. Spring
Nivel 14 , Lección 3
Disponible

Cuando empezamos a hablar sobre la gestión de procesos de negocio, queda claro que Saga —no es solo otro patrón de libro—. Es un salvavidas para procesos complejos donde participan varios microservices. Imagínate una tienda online: el usuario hace un pedido, el sistema verifica la disponibilidad en el almacén, la reserva, se cobra el pago y se notifica al servicio de entrega. Cada paso tiene su propia complejidad: desde APIs externas hasta interacciones con la base de datos. ¿Qué pasa si en algún punto algo falla? ¿Se ha cobrado el dinero y el producto no quedó reservado? Ahí es donde entra Saga.

Saga es justo lo que ayuda a mantener las transacciones coherentes cuando hay fallos. Es como un baile donde dos compañeros siguen unas figuras: si uno se equivoca, el otro ayuda a volver al ritmo. En este caso ese "baile" afecta a los datos y a la lógica de negocio.


Integración de Saga en procesos de negocio

Saga es más útil en procesos que:

  1. Involucran varios microservices que realizan partes de una transacción.
  2. Requieren ejecutar acciones en una secuencia estricta.
  3. Deben garantizar rollback de operaciones en caso de error.

Un ejemplo puede ser el proceso de gestión de pedidos, ya mencionado arriba. Lo veremos con más detalle.

Tomeos un ejemplo algo idealizado (pero realista). El proceso de un pedido se ve así:

  1. Creación del pedido — el usuario elige el producto y realiza el pedido.
  2. Comprobación en almacén — el sistema verifica la disponibilidad en el almacén.
  3. Reserva del producto — si el producto está disponible, se reserva.
  4. Cobro del pago — el sistema carga el importe en la tarjeta bancaria del cliente.
  5. Notificación de entrega — el pedido se pasa al servicio de entrega.

Cada uno de estos pasos puede ser manejado por distintos microservices. Saga ayuda a hacer el proceso fiable: si el paso "Reserva del producto" falla (por ejemplo, se ha agotado), se pueden revertir las operaciones previas (por ejemplo, cancelar la creación del pedido).


Cómo ayuda Saga en la gestión de procesos de negocio

Saga ayuda a:

  1. Coordinar procesos entre microservices. En vez de escribir código complejo para gestionar el proceso manualmente, definimos pasos y acciones compensatorias para cada transacción.
  2. Proveer tolerancia a fallos. Si uno de los pasos no puede completarse, la saga inicia las acciones compensatorias para devolver el sistema a un estado estable.
  3. Reducir el tiempo de desarrollo. Un enfoque estandarizado de sagas permite diseñar procesos fiables más rápido.

¿De qué se compone una Saga?

  1. Pasos — acciones ejecutadas dentro de la transacción. Por ejemplo, "reservar producto".
  2. Pasos compensatorios — acciones que deshacen los cambios hechos en pasos anteriores. Por ejemplo, "cancelar reserva del producto".
  3. Gestor de Saga — componente (o librería) que coordina la ejecución de los pasos. Decide qué acciones ejecutar a continuación o qué paso compensar en caso de error.

Ejemplo

Supongamos que diseñamos un sistema para gestionar pedidos en una tienda online. Requisitos:

  • Éxito de todos los pasos de la operación: creación del pedido, reserva de productos, cobro del pago, notificación de entrega.
  • Rollback de todas las operaciones en caso de error en cualquier etapa.

Diseño del sistema

Esta es la secuencia de interacción entre microservices usando el patrón Saga:


[Order Service] -> Crear pedido
    v
[Inventory Service] -> Reservar producto
    v
[Payment Service] -> Cobrar el pago
    v
[Delivery Service] -> Notificar al servicio de entrega

Acciones compensatorias en caso de error:

  • Si no se pudo reservar el producto, el pedido en Order Service se cancela.
  • Si no se pudo cobrar el pago, se libera la reserva del producto.
  • Si no se pudo notificar al servicio de entrega, el dinero se devuelve al usuario.

Implementación de Saga

Paso 1: definición de pasos y compensaciones

Ejemplo de código para el paso de reserva del producto:


public class InventoryService {

    public void reserveProduct(String productId, int quantity) {
        // Lógica de reserva de producto
        System.out.println("Reserva de producto: " + productId);
    }

    public void cancelReservation(String productId, int quantity) {
        // Lógica para cancelar la reserva
        System.out.println("Cancelación de la reserva del producto: " + productId);
    }
}

Paso 2: gestor de Saga

Para la orquestación usamos un gestor de Saga hecho a mano.


public class SagaManager {

    private final List<SagaStep> sagaSteps = new ArrayList<>();

    public void addStep(SagaStep step) {
        sagaSteps.add(step);
    }

    public void execute() {
        Stack<SagaStep> executedSteps = new Stack<>();
        try {
            for (SagaStep step : sagaSteps) {
                step.perform();
                executedSteps.push(step);
            }
        } catch (Exception e) {
            while (!executedSteps.isEmpty()) {
                executedSteps.pop().compensate();
            }
        }
    }
}

Paso 3: definición de pasos en la Saga

Cada paso se implementa mediante la interfaz SagaStep.


public interface SagaStep {
    void perform();
    void compensate();
}

// Ejemplo de implementación de un paso
public class ReserveInventoryStep implements SagaStep {

    private final InventoryService inventoryService;
    private final String productId;
    private final int quantity;

    public ReserveInventoryStep(InventoryService inventoryService, String productId, int quantity) {
        this.inventoryService = inventoryService;
        this.productId = productId;
        this.quantity = quantity;
    }

    @Override
    public void perform() {
        inventoryService.reserveProduct(productId, quantity);
    }

    @Override
    public void compensate() {
        inventoryService.cancelReservation(productId, quantity);
    }
}

Paso 4: ejecutar la Saga

Ahora juntamos todo y ejecutamos la Saga.


public class SagaExample {

    public static void main(String[] args) {
        InventoryService inventoryService = new InventoryService();

        SagaManager sagaManager = new SagaManager();
        sagaManager.addStep(new ReserveInventoryStep(inventoryService, "product-123", 2));

        // Añade aquí otros pasos (por ejemplo, cobro del pago, notificación de entrega)

        sagaManager.execute();
    }
}

Beneficios para el negocio

Un sistema basado en Saga:

  • Soporta escalabilidad. Puedes añadir nuevos pasos sin romper la lógica existente.
  • Garantiza consistencia de datos incluso ante fallos.
  • Ofrece flexibilidad. La elección entre orquestación y coreografía permite adaptarse a distintos escenarios.

Por ejemplo, Amazon, Uber y otras grandes empresas usan activamente Saga para gestionar procesos de negocio clave. Si funciona para ellos, seguro te será útil a ti también.


Ahora que tienes una idea de cómo aplicar el patrón Saga, estás listo para pasar a la práctica y empezar a construir procesos de negocio realmente resistentes a fallos. ¡A practicar productivamente!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION