Resumen del artículo: Sagas
H. García-Molina y K. Salem. 1987. Sagas . En Actas de la conferencia internacional ACM SIGMOD de 1987 sobre gestión de datos (SIGMOD '87). Association for Computing Machinery, Nueva York, NY, EE. UU., 249–259.
Palabras clave: Procesos de larga ejecución, Sagas, Transacciones, Compensación, Mitigación de fallas, Tolerancia a fallas, Transparencia de fallas
Aunque el artículo original sobre Sagas se escribió hace 35 años, el problema sigue siendo igual de relevante en la actualidad. Esta publicación explora los orígenes del concepto de Sagas, procesos de larga ejecución que abarcan múltiples transacciones de bases de datos.
Introducción
En su artículo Sagas, Héctor García-Molina y Kenneth Salem introducen el concepto de sagas para implementar operaciones de “ejecución prolongada”.
Molina y Salem se refieren a los procesos que consisten en un solo paso como procesos de "ejecución corta" o "de corta duración" y a los procesos que consisten en varios pasos como "de ejecución prolongada" o "de larga duración". Por lo tanto, de ejecución corta o de ejecución prolongada no es una afirmación sobre el tiempo físico, sino una afirmación sobre el tiempo lógico en el que cada paso es un tictac del reloj (Figura 1).
El problema
En un ecosistema que rechaza en gran medida la idea de las transacciones distribuidas o la retención de bloqueos durante un período prolongado, cualquier proceso de ejecución prolongada no puede asignarse simplemente a una transacción distribuida de ejecución prolongada. En cambio, necesitamos un mecanismo diferente para componer procesos de ejecución prolongada a partir de transacciones no distribuidas de ejecución corta.
El documento define un proceso P como una secuencia de pasos a, b, etc., donde cada paso es una transacción de base de datos. Para usar términos más familiares, puede pensar en un proceso como una función y la secuencia de pasos como una secuencia de llamadas API a la base de datos.
Nos referimos a la secuencia de pasos a, b, etc como una traza:
trace(P) = a • b • …
En otras palabras: ¡una secuencia de dos transacciones no es una transacción!
Trivialmente, si un proceso consta de una sola transacción, el proceso exhibe las garantías de atomicidad de una transacción (Figura 3).
Sin embargo, si un proceso consta de múltiples transacciones, el proceso no exhibe las garantías de atomicidad de una transacción: el proceso puede ejecutarse parcialmente (Figura 4).
Sin embargo, a diferencia de otras transacciones, las transacciones de un proceso están relacionadas y deben ejecutarse como una unidad; cualquier ejecución parcial de un proceso no es deseable.
El documento analiza una aplicación de reserva de viajes, donde un viaje consta de múltiples vuelos potencialmente en diferentes aerolíneas. Aquí, reservar un viaje implica múltiples transacciones, una por tramo de viaje. Como viajeros, queremos que todas las transacciones se ejecuten como una unidad: queremos reservar todos los vuelos o ninguno, reservar algunos vuelos es inaceptable.
La solución
El documento presenta Sagas, un protocolo para implementar procesos de ejecución prolongada. El protocolo Saga asegura que un proceso es atómico, es decir, un proceso se ejecuta de forma observable equivalente a completamente o no se ejecuta en absoluto.
Para mitigar la ejecución parcial, un proceso puede implementar una recuperación hacia adelante o hacia atrás [2]:
Recuperación hacia adelante
La recuperación de fallas hacia adelante se refiere a las estrategias de mitigación de fallas que hacen que el sistema pase del estado intermedio a un estado que es equivalente al estado final (hacer avanzar el proceso).
Recuperación hacia atrás
La recuperación de fallas hacia atrás se refiere a las estrategias de mitigación de fallas que hacen que el sistema pase del estado intermedio a un estado equivalente al estado inicial (haciendo retroceder el proceso).
Recuperación hacia atrás y compensación
Para habilitar la recuperación hacia atrás, cada proceso debe registrar un paso de compensación para cada paso (Figura 6).
El paso de compensación deshace, desde un punto de vista semántico, el paso, pero no necesariamente devuelve la base de datos al estado que existía cuando comenzó el paso. La compensación restaurará el mundo a un estado que es una aproximación aceptable al estado que tenía antes del inicio de la transacción.
Por ejemplo, volviendo a la aplicación de reserva de viajes, si un viaje consta de dos vuelos y la reserva del primer vuelo fue exitosa pero la reserva del segundo falló, la saga necesita cancelar la primera reserva para devolver la base de datos a una aproximación aceptable al estado tenía antes del inicio de la reserva del viaje.
Ejecución
Entonces, en ausencia de falla, un proceso P produce la traza deseada
trace(P) = s₁ • s₂ • … sₙ • ✔️
trace(P) = s₁ • s₂ • … sᵢ • × • cᵢ … • c₂ • c₁ • ✔️
Cuando una falla interrumpe un Saga, un Saga debe poder recuperar su estado actual y realizar una recuperación hacia adelante o hacia atrás. Por lo tanto, una Saga debe poder registrar el comienzo de una Saga, la finalización de una Saga y registrar puntos de control y compensaciones.
Si es el propietario de la base de datos, puede registrar puntos de control y compensaciones transaccionales con cada paso. Si no puede registrar los puntos de control y las compensaciones de manera transaccional con cada paso, debe diseñar un mecanismo para registrar las compensaciones de los puntos de control de manera confiable.
Discusión
Aunque el documento fue escrito hace más de 35 años, el problema y Sagas como la solución propuesta siguen siendo relevantes hoy en día. Sin embargo, la atención se ha desplazado de la composición de transacciones de bases de datos a la composición de invocaciones de servicios.
Tenga en cuenta que los servicios no exhiben propiedades transaccionales: los servicios pueden no ser atómicos, después de una invocación de servicio, y si el servicio falla, es posible que no sepa si el servicio tuvo efecto o no.
Por lo tanto, debe registrar una acción de compensación antes de invocar un servicio y diseñar la lógica de compensación para que sea correcta, ya sea que el servicio tenga efecto o no.
Conclusión
Las sagas siguen siendo relevantes, a pesar de los avances significativos en la teoría y la práctica desde la publicación del artículo. El concepto básico de Saga como protocolo para implementar atomicidad en un entorno distribuido a través de transacciones o servicios, las técnicas descritas en el documento continúan siendo ampliamente utilizadas en la actualidad.
Referencias
- [1] Una semántica de rastreo para transacciones de larga ejecución, M. Butler, CAR Hoare & C. Ferreira, 2005
- [2] Manejo de fallas desde los primeros principios , Dominik Tornow, 2022

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































