Pular para o conteúdo

Consistência Transacional: Monolito vs Microsserviços

No monolito, consistência é simples porque existe um único banco de dados e transações ACID resolvem boa parte do problema.

Características:

  • Atomicidade
  • Consistência forte
  • Rollback automático

Exemplo: criar pedido e debitar saldo na mesma transação.

Cada serviço tem seu próprio banco e sua própria responsabilidade. O resultado é que não existe transação ACID global.

Você entra no mundo de:

  • Consistência eventual
  • Sistemas distribuídos
  • Falhas parciais

Como garantir consistência em um fluxo como:

  1. Criar pedido
  2. Cobrar pagamento
  3. Atualizar estoque

Se cada passo está em um serviço diferente?

Existem duas famílias de resposta: tentar manter consistência forte com um protocolo de commit distribuído como o Two-Phase Commit, ou abrir mão da consistência forte e coordenar transações locais com compensação, que é a ideia das sagas.

Uma saga é uma sequência de transações locais:

  • Cada serviço executa sua parte
  • Em caso de erro, executa ações compensatórias

Exemplo:

  1. Pedido criado
  2. Pagamento falhou
  3. Pedido cancelado como compensação

O detalhamento do padrão (tipos de passo, projeto de ações compensatórias, isolamento) está na nota Saga Pattern.

flowchart LR
    Orchestrator["Orchestrator (checkout)"]

    Orchestrator --> Cart[Cart]
    Orchestrator --> Inventory[Inventory]
    Orchestrator --> Payment[Payment]
    Orchestrator --> Order[Order]

Existe um orquestrador central que controla o fluxo.

Vantagens: fluxo explícito, mais fácil de depurar, controle total.

Desvantagens: ponto único de falha e maior acoplamento.

flowchart LR
    Checkout["Checkout"] -- HTTP --> Cart["Cart"]
    Cart --> Broker["Message Broker (Kafka)"]
    Broker --> Inventory["Inventory"] & Payment["Payment"] & Order["Order"]
    Inventory --> Broker
    Payment --> Broker

Não existe controlador central. Cada serviço reage a eventos.

Vantagens: baixo acoplamento, alta escalabilidade, resiliência maior.

Desvantagens: debug e observabilidade mais difíceis.

AspectoOrquestraçãoCoreografia
ControleCentralizadoDistribuído
AcoplamentoMédioBaixo
ObservabilidadeMais fácilMais difícil
EscalabilidadeMenorMaior
Complexidade mentalBaixaAlta

Consistência em microsserviços não é sobre evitar falhas. É sobre saber lidar com elas.

  • Idempotência
  • Retries com backoff
  • Dead letter queues
  • Observabilidade
  • Versionamento de eventos
  • Monolito: simples e consistente
  • Microsserviços: distribuídos e sujeitos a falhas parciais
  • Sagas: forma comum de coordenar consistência
  • Orquestração: controle central
  • Coreografia: eventos distribuídos