Máquinas de Estado em Sagas: Orquestrando Transações Distribuídas
Quando implementamos Sagas em microserviços, uma forma de organizar a lógica de cada passo (e de suas compensações) é por meio de máquinas de estado (state machines). Nesse modelo, cada etapa do fluxo pode ser vista como um estado, com transições que levam a novos estados de sucesso ou falha. Desta forma, ganha-se clareza no desenho do processo e na forma como compensações são disparadas em caso de erro.
1. Por Que Usar Máquinas de Estado em Sagas?
- Visualização e Organização
- A Saga pode ser modelada como um “fluxo” de estados: “Iniciando”, “Em Execução”, “Compensando”, “Concluído” etc.
- É mais fácil de explicar e manter, pois a equipe enxerga claramente cada transição.
- Controle de Erros e Exceções
- Se um serviço falha no meio do caminho, a máquina de estado passa a um estado de erro, iniciando compensações de forma previsível.
- Cada estado tem suas próprias transições para encaminhar falhas ou retentativas.
- Fácil Evolução
- Precisa inserir um passo extra ou um novo fluxo de compensação? Basta criar novos estados e transições, sem refatorar toda a lógica procedural.
2. Conceitos Básicos de Máquina de Estado
Uma máquina de estado (Finite State Machine – FSM) é definida por:
- Conjunto de Estados: Possíveis situações em que o fluxo pode se encontrar (por exemplo, “Aguardando Pagamento”, “Pagamento Aprovado”, “Pagamento Falhou”).
- Eventos ou Ações: O que causa a transição entre estados (receber resposta de outro serviço, um timeout, um evento de falha, etc.).
- Transições: A mudança de um estado para outro, disparada por determinado evento ou condição.
- Estado Inicial e Estado Final: Onde o fluxo começa e onde termina (com sucesso ou falha).
No padrão Saga, cada “passo” (transação local em um microserviço) pode corresponder a um estado, e a “compensação” é um evento/transição que leva a outros estados de correção ou rollback.
3. Exemplo de Máquina de Estado para uma Saga
Suponha um processo de criação de pedido em 3 passos:
- Criar Pedido (Serviço de Pedidos)
- Processar Pagamento (Serviço de Pagamento)
- Reservar Estoque (Serviço de Inventário)
3.1 Definindo Estados
PEDIDO_INICIADO
: Saga acabou de começar, pedido ainda não criado.PEDIDO_CRIADO
: Pedido criado com sucesso, aguardando pagamento.PAGAMENTO_APROVADO
: Pagamento ok, próximo passo é reservar estoque.PAGAMENTO_FALHOU
: Pagamento falhou, iniciar compensação do pedido.ESTOQUE_RESERVADO
: Estoque reservado, a saga está próxima do fim.ESTOQUE_FALHOU
: Falhou na reserva, compensar pagamento e pedido.COMPENSANDO
: Estado genérico de rollback em andamento.CONCLUIDO_SUCESSO
: Estado final de sucesso.CONCLUIDO_FALHA
: Estado final de falha após compensações.
3.2 Transições
- (Evento: Pedido Criado):
PEDIDO_INICIADO
→PEDIDO_CRIADO
- (Evento: Pagamento OK):
PEDIDO_CRIADO
→PAGAMENTO_APROVADO
- (Evento: Pagamento Falhou):
PEDIDO_CRIADO
→PAGAMENTO_FALHOU
- Em seguida, transição para
COMPENSANDO
(para desfazer o pedido).
- (Evento: Estoque OK):
PAGAMENTO_APROVADO
→ESTOQUE_RESERVADO
- (Evento: Estoque Falhou):
PAGAMENTO_APROVADO
→ESTOQUE_FALHOU
- Em seguida, transição para
COMPENSANDO
(para reverter pagamento e pedido).
- (Evento: Compensação Concluída com Falha):
COMPENSANDO
→CONCLUIDO_FALHA
- (Evento: Tudo OK):
ESTOQUE_RESERVADO
→CONCLUIDO_SUCESSO
3.3 Ilustração em Diagrama
stateDiagram-v2 [*] --> PEDIDO_INICIADO PEDIDO_INICIADO --> PEDIDO_CRIADO : PedidoCriado PEDIDO_CRIADO --> PAGAMENTO_APROVADO : PagamentoOk PEDIDO_CRIADO --> PAGAMENTO_FALHOU : PagamentoErro state "PAGAMENTO_FALHOU" as PF PF --> COMPENSANDO : IniciaRollbackPedido
PAGAMENTO_APROVADO --> ESTOQUE_RESERVADO : ReservaOk PAGAMENTO_APROVADO --> ESTOQUE_FALHOU : FalhaEstoque state "ESTOQUE_FALHOU" as EF EF --> COMPENSANDO : IniciaRollbackPagtoEPedido COMPENSANDO --> CONCLUIDO_FALHA : RollbackTerminado ESTOQUE_RESERVADO --> CONCLUIDO_SUCESSO : SagaCompleta [*] --> CONCLUIDO_FALHA [*] --> CONCLUIDO_SUCESSO
4. Como Implementar
4.1 Orquestrador Baseado em Máquina de Estado
Se a Saga for orquestrada, podemos ter um serviço orquestrador que mantém essa máquina de estado internamente. A cada evento (resposta de um serviço, timeout, falha), o orquestrador:
- Lê o estado atual.
- Avalia a transição correspondente.
- Atualiza o estado.
- Dispara novas ações (por exemplo, chamar o próximo serviço, compensar um anterior etc.).
4.2 Coreografia com Máquinas de Estado
Em coreografia, cada serviço pode ter sua própria máquina de estado local, reagindo a eventos vindos de outros serviços. Há maior complexidade, pois não há um ponto único com a visão de todo o fluxo. Ainda assim, a ideia de mapear estados e transições ajuda cada serviço a entender como reagir a cada evento.
5. Vantagens das Máquinas de Estado
- Clareza e Manutenção
- Fica explícito quais são os estados possíveis e o que dispara cada transição.
- Novas etapas podem ser adicionadas definindo apenas novos estados e eventos.
- Rastreabilidade
- Cada mudança de estado pode ser logada, facilitando a observabilidade.
- É mais simples de depurar quando a lógica de transição é bem definida.
- Controle de Falhas
- Se algo inesperado ocorre, a máquina de estado pode levar a um estado de erro bem definido, disparando compensações de forma organizada.
6. Dicas de Boas Práticas
- Documente os Estados e Eventos
- Tenha um diagrama ou tabela que a equipe possa consultar, evitando confusões sobre “em que estado podemos receber tal evento”.
- Identificadores de Estado
- Se usar orquestrador, mantenha um campo
currentState
persistido no banco, indicando em qual estado a Saga se encontra, para retomar em caso de falha.
- Se usar orquestrador, mantenha um campo
- Time-Out e Ações Automáticas
- Certos estados podem precisar de limite de tempo. Se não houver transição em X segundos/minutos, dispara evento de falha ou retentativa.
- Exemplo: “Aguardando Pagamento” por 10 minutos.
- Automação de Compensação
- Em orquestração, ao receber falha, a máquina de estado transita para “Compensando” e efetua rollback passo a passo. Em coreografia, cada serviço local sabe qual estado de rollback assumir.
- Ferramentas Especializadas
- Plataformas de workflow/BPM (Camunda, Zeebe, Temporal, AWS Step Functions) podem representar cada estado e transição visualmente.
- Mesmo sem adotar uma plataforma de workflow, projetar explicitamente uma FSM (Finite State Machine) ajuda bastante.
7. Conclusão
Adicionar o conceito de máquina de estado ao padrão Saga traz organização e previsibilidade. Cada etapa do processo de negócio vira um estado claramente definido, enquanto as transições representam eventos de sucesso ou falha (incluindo compensações). Dessa forma, seja em um modelo orquestrado ou coreografado, as equipes conseguem:
- Entender facilmente o fluxo da Saga.
- Evoluir o processo sem reescrever toda a lógica.
- Depurar e observar onde falhas ocorrem, acionando compensações de maneira controlada.
Seja qual for o tipo de Saga utilizado (síncrona/assíncrona, atômica/eventual, orquestrada/coreografada), máquinas de estado tornam a lógica de transição mais clara, robusta e escalável.