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.