Saga: O herói da consistência em sistemas distribuídos
Tags: programming, architecture
Published: 2023-05-09 14:06:18

O padrão Saga foi proposto pela primeira vez em 1987 por Hector Garcia-Molina e Kenneth Salem, e consiste em uma sequência de transações que podem ser executadas de forma independente e assíncrona, mas que precisam garantir a consistência do estado do sistema em caso de falhas. Vamos ver como funciona esse padrão e quais são as suas vantagens e desafios.

**O que é uma saga?**

É uma técnica utilizada em sistemas distribuídos para implementar transações de longa duração que envolvem múltiplos serviços ou recursos. Por exemplo, imagine que você queira realizar uma compra em um e-commerce que envolva a reserva de um produto, a validação de pagamento e a confirmação de entrega. Cada uma dessas operações pode ser executada por um serviço diferente, que pode estar em um servidor diferente e que pode ter seu próprio banco de dados.

Caso ocorra algum problema durante o processo, como uma falha na validação de pagamento, pode ser necessário desfazer as operações anteriores e manter o estado do sistema consistente. Nesse caso, é possível utilizar o padrão saga para resolver esse problema.

O padrão consiste em dividir cada transação em duas partes: uma operação e uma compensação. A operação é a ação que altera o estado do sistema, como reservar um produto ou validar um pagamento. A compensação é a ação que reverte o estado do sistema em caso de falha, como cancelar uma reserva ou estornar um pagamento.

Cada operação deve ter uma compensação associada, que deve ser idempotente e reversível. Dessa forma, é possível garantir que, em caso de falha, o estado do sistema seja mantido consistente e as operações anteriores sejam desfeitas de forma segura.

A saga então executa as operações em sequência, de forma assíncrona e independente, usando mensagens ou eventos para comunicar entre os serviços. Se todas as operações forem bem sucedidas, a saga termina com sucesso. Se alguma operação falhar, a saga inicia um processo de rollback, executando as compensações das operações anteriores na ordem inversa. Dessa forma, a saga garante que o estado do sistema seja consistente ao final da transação.

**Quais são as vantagens do padrão saga?**

O padrão saga tem algumas vantagens em relação a outras formas de implementar transações distribuídas, como o protocolo de confirmação em duas fases (2PC). Algumas dessas vantagens são:

- Redução do acoplamento entre os serviços: cada serviço é responsável por executar a sua própria operação e compensação, sem depender de um coordenador central ou de bloqueios nos recursos.
- Melhor desempenho e escalabilidade: as operações podem ser executadas de forma assíncrona e paralela, aproveitando melhor os recursos disponíveis e reduzindo o tempo de resposta da transação.
- Maior tolerância a falhas: as operações podem ser reexecutadas ou compensadas em caso de falhas temporárias ou permanentes, sem comprometer a consistência do sistema.

**Quais são os desafios do padrão saga?**

O padrão também tem alguns desafios e limitações que devem ser considerados antes de adotá-lo. Alguns desses desafios são:

- Complexidade na implementação: o padrão saga exige um cuidado maior na definição das operações e compensações, que devem ser idempotentes e reversíveis. Além disso, é preciso garantir que as mensagens ou eventos sejam entregues e processados corretamente pelos serviços envolvidos na saga.
- Consistência eventual: o padrão saga não garante a consistência imediata dos dados entre os serviços, pois as operações podem levar algum tempo para serem concluídas ou compensadas. Isso pode gerar situações de inconsistência temporária, que devem ser tratadas adequadamente pela aplicação.
- Monitoramento e rastreabilidade: o padrão saga requer um mecanismo de monitoramento e rastreabilidade das sagas, para que seja possível acompanhar o estado e o resultado de cada operação e compensação. Isso facilita a identificação e a resolução de problemas que possam ocorrer durante a execução das sagas.

Esses são alguns dos principais desafios do padrão saga, que devem ser avaliados antes de sua aplicação em um contexto de microserviços. 

Em resumo, o padrão saga é uma opção viável e eficaz para lidar com transações distribuídas em sistemas baseados em microserviços. Embora apresente alguns desafios e limitações, esses podem ser mitigados com técnicas e ferramentas adequadas. É importante avaliar cuidadosamente as necessidades do sistema e as capacidades da equipe antes de decidir implementar o padrão saga.