transactions - three - 2PC vs Sagas(transacciones distribuidas)
two phase commit (1)
Estoy desarrollando mi visión sobre los sistemas distribuidos y cómo mantener la consistencia de los datos en dichos sistemas, donde las transacciones comerciales cubren múltiples servicios, contextos limitados y límites de red.
Aquí hay dos enfoques que sé que se utilizan para implementar transacciones distribuidas:
- 2-fase de confirmación (2PC)
- Sagas
2PC es un protocolo para que las aplicaciones utilicen de forma transparente las transacciones globales de ACID con el soporte de la plataforma. Al estar integrado en la plataforma, es transparente para la lógica empresarial y el código de la aplicación, que yo sepa.
Las sagas, por otro lado, son series de transacciones locales, donde cada transacción local muta y persiste a las entidades junto con una bandera que indica la fase de la transacción global y confirma el cambio. En otras palabras, el estado de la transacción es parte del modelo de dominio. La reversión es una cuestión de cometer una serie de transacciones "invertidas". Los eventos emitidos por los servicios desencadenan estas transacciones locales en cualquier caso.
Ahora, ¿cuándo y por qué uno usaría sagas sobre 2PC y viceversa? ¿Cuáles son los casos de uso y las ventajas y desventajas de ambos? Especialmente, la fragilidad de las sagas me pone nerviosa, ya que la transacción distribuida invertida también podría fallar.
En mi entendimiento (no soy un gran usuario de 2PC ya que lo considero limitante):
- Normalmente, 2PC es para transacciones inmediatas .
- Típicamente, las sagas son para transacciones de larga duración .
Los casos de uso son obvios después:
- 2PC puede permitirle comprometer la transacción completa en una solicitud o algo así, abarcando esta solicitud en todos los sistemas y redes. Suponiendo que cada sistema y red participantes sigan el protocolo, puede confirmar o deshacer la transacción completa sin problemas.
- Saga le permite dividir la transacción en varios pasos, que abarcan largos períodos de tiempo (no necesariamente sistemas y redes).
Ejemplo:
- 2PC: Guardar cliente para cada solicitud de factura recibida, mientras que ambos son administrados por 2 sistemas diferentes.
- Sagas: reserve un itinerario de vuelo que consiste en varios vuelos de conexión, mientras que cada vuelo individual es operado por diferentes aerolíneas.
Personalmente considero que Saga es capaz de hacer lo que 2PC puede hacer. Lo opuesto no es exacto.
Creo que las sagas son universales, mientras que 2PC implica el bloqueo de la plataforma / proveedor.