Patrón: Saga. La transaccionalidad en los µServicios

El patrón Saga, es de los más importantes y siempre recomendados a tener en cuenta cuando desarrollamos microservicios, así esté la aplicación manejada con coreografía u orquestación.

Supongamos el escenario donde tenemos una aplicación monolítica que realiza el proceso de creación de una orden en un restaurante.

Aplicación monolítica

Si algo inesperado sucediera en el momento de realizar el pago de la orden en la etapa final (como fondos insuficientes), debe deshacerse completamente la reservación para que quede libre para otra persona.
En este escenario es bastante sencillo, pues tenemos todo en una misma aplicación, con una base de datos única y podemos realizar un update directamente en la base de datos para liberar la reservación.

Si el escenario fuera una aplicación en un entorno de microservicios, como la siguiente figura, la forma de gestionar los fondos insuficientes cambia.

Microservicios

Este segundo escenario es más complejo, pues cada microservicio usa su propia base de datos y no podemos (o debemos) hacer una acción desde un servicio a una base de datos de otro servicio.

En esencia si tenemos un sistema, que realiza una serie de operaciones, y alguna de estas operaciones falla, debemos tener la capacidad de compensar las acciones exitosas hasta el punto de fallo y volverlas a su estado original (deshacerlas), para mantener la consistencia del sistema. Este objetivo, precisamente se logra a través de la aplicación del patrón Saga.

Para implementar el patrón Saga debemos crear por cada acción una operación compensatoria, por ejemplo:

  • Acción: Crear reservación.
  • Acción compensatoria: Liberar reservación.

La implementación de una saga es secuencial, si luego de ejecutar una serie de acciones A → B → C → D la acción D falla, entonces hay que ejecutar en orden inverso C → B →  A.

En la Saga debe existir un Commander (en la bibliografía también refiere como Saga Manager), encargado de controlar los estados entre llamada y llamada, es buena práctica usar una máquina de estados que permita realizar el rollback de las operaciones llamando a las acciones compensatorias.

Representación de una Saga / Acciones compensatorias

La implementación de una Saga debe ser concebida desde el comienzo del desarrollo, en cada microservicio deben concebirse operaciones compensatorias. Para la implementación del commander que es el encargado de conocer y ejecutar las operaciones compensatorias a llamar en caso de fallas deben tenerse en cuenta herramientas que permitan manejo de estados, por ejemplo Camunda, Conductor o simplemente implementarla, usando, por ejemplo Spring State Machine.

Para profundizar en el patrón Saga es importante comprender los patrones de coreografía y orquestación, los cuales soportan una Saga y serán abordados en siguientes artículos.