Sobes.tech
Middle — Middle+

Como é que o padrão Saga é implementado para gerir transações distribuídas na arquitetura de microserviços?

sobes.tech IA

Resposta da IA

O padrão Saga é utilizado para gerir transações distribuídas numa arquitetura de microserviços, onde as transações tradicionais ACID não são possíveis devido à distribuição de dados e serviços.

A ideia é que uma grande operação de negócio seja dividida numa série de transações locais em diferentes serviços. Cada transação local é acompanhada de uma operação de compensação que reverte o seu efeito em caso de erro em qualquer passo.

A implementação em Go geralmente baseia-se num orquestrador ou numa coreografia:

  • Orquestrador: um serviço centralizado que gere a sequência de passos e chame as transações locais, gerindo erros e executando transações de compensação.
  • Coreografia: cada serviço publica eventos sobre a execução de um passo, outros serviços reagem a eles, realizando os seus próprios passos ou ações de compensação.

Exemplo de uma orquestração simplificada em Go:

func RunSaga() error {
    if err := ServiceA.DoStep(); err != nil {
        return err
    }
    if err := ServiceB.DoStep(); err != nil {
        ServiceA.Compensate() // reverter o primeiro passo
        return err
    }
    if err := ServiceC.DoStep(); err != nil {
        ServiceB.Compensate()
        ServiceA.Compensate()
        return err
    }
    return nil
}

Em sistemas reais, utilizam-se filas de mensagens (Kafka, RabbitMQ) para transmitir eventos e gerir o estado da saga, bem como armazenar o estado da saga numa base de dados para resistência a falhas.