Tipo de Estampa: Saga

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:


  1. Order Service ( ) cria um Order () no status pendente (pendente) e publica o evento OrderCreated ()
  2. Customer Service ( ) recebe um evento e tenta reservar crédito para o pedido. Em seguida, ele publica um dos dois eventos: CreditReserved () ou CreditLimitExceeded ()
  3. 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:


  1. Order Service ( ) cria um Order () no status pendente (pendente) e cria um CreateOrderSaga ()
  2. CreateOrderSaga () envia o comando ReserveCredit () para o Customer Service ( )
  3. Customer Service ( ) tenta reservar um empréstimo para um pedido e envia uma resposta
  4. CreateOrderSaga () recebe uma resposta e envia um comando RejectOrder () ou RejectOrder () no Order Service ( )
  5. 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.

Source: https://habr.com/ru/post/pt427705/


All Articles