Olá Habr! Apresento a você a tradução do artigo "Pattern: Saga", de Chris Richardson.
A situação
Há um aplicativo ao qual o padrão Banco de Dados por Serviço foi aplicado. Agora, cada serviço de aplicativo possui seu próprio banco de dados. Algumas transações comerciais abrangem vários serviços ao mesmo tempo, portanto, é necessário um mecanismo para garantir a consistência dos dados entre esses serviços.
Por exemplo: vamos imaginar que estamos desenvolvendo uma loja online onde um cliente tem um limite de crédito. O aplicativo deve garantir que o novo pedido não exceda o limite de crédito do cliente. Como Pedidos e Clientes são bancos de dados diferentes, o aplicativo não pode usar transações ACID locais.
O problema
Como garantir a consistência dos dados entre os serviços?
Solução
Toda transação comercial que abrange vários serviços precisa ser implementada como uma saga.
Uma saga é uma coleção de transações locais. Cada transação local atualiza o banco de dados e publica uma mensagem ou evento, iniciando a próxima transação local na saga. Se a transação falhou, por exemplo, devido a uma violação das regras de negócios, a saga lança transações compensatórias que revertem as alterações feitas pelas transações locais anteriores.

Existem duas maneiras de coordenar as sagas:
- Coreografia - Cada transação publica eventos que acionam transações em outros serviços.
- Orquestração - Um orquestrador informa aos participantes quais transações devem ser iniciadas.
Exemplo: Saga Baseada em Coreografia

Em uma loja online que usa uma saga baseada em coreografia, a criação de um pedido incluirá as seguintes etapas:
Order Service ( )
cria um Order ()
no status pendente (pendente) e publica o evento OrderCreated ()
Customer Service ( )
recebe um evento e tenta reservar crédito para o pedido. Em seguida, ele publica um dos dois eventos: CreditReserved ()
ou CreditLimitExceeded ()
Order Service ( )
recebe um evento e altera o status do pedido para aprovado (confirmado) ou cancelado (cancelado)
Exemplo: Saga Orquestral

Em uma loja online usando uma saga baseada em orquestração, a criação de um pedido incluirá as seguintes etapas:
Order Service ( )
cria um Order ()
no status pendente (pendente) e cria um CreateOrderSaga ()
CreateOrderSaga ()
envia o comando ReserveCredit ()
para o Customer Service ( )
Customer Service ( )
tenta reservar um empréstimo para um pedido e envia uma respostaCreateOrderSaga ()
recebe uma resposta e envia um comando RejectOrder ()
ou RejectOrder ()
no Order Service ( )
Order Service ( )
altera o status do pedido para aprovado (confirmado) ou cancelado (cancelado)
Saga tem as seguintes vantagens
- Permite que um aplicativo mantenha a consistência dos dados entre os serviços sem usar transações distribuídas.
A saga tem as seguintes desvantagens
- O modelo de programação está se tornando mais complexo. Por exemplo, os desenvolvedores devem criar transações compensatórias que revertam as alterações feitas anteriormente na saga.