Event-Carried State Transfer: Consistência e isolamento entre microsserviços

Lauan Guermandi
3 min readFeb 13, 2024

--

Introdução

Ao trabalhar com a consistência eventual dos dados, temos desafios importantes para resolver, pois ao perder a consistência, a aplicação não cumpre a regra de negócio proposta.

Evento de domínio

Um evento de domínio reflete mudanças de estado ou a ocorrência de atividades importantes no domínio de negócios específico ao qual o sistema está relacionado.

Vamos ao exemplo

Imagine que temos os seguintes microsserviços.

Ao adicionar um novo pedido e ele ser pago, um evento de domínio PagamentoEvetuado é gerado. Para fazer o envio a api de remessa recebe esse evento e prepara o envio, e para isso ela precisa do endereço do cliente que não vem no evento. Como obtemos essa informação?

Podemos consultar os dados na serviço de cliente da seguinte forma.

Qual problema podemos ter com essa abordagem?

Se o serviço de cliente estiver fora, não vamos conseguir consultar essas informações assim não vamos conseguir fazer o pedido.

Bulkhead Pattern

Basicamente, o padrão Bulkhead propõe a divisão do sistema em “compartimentos” separados, onde cada componente ou serviço é isolado uns dos outros, geralmente utilizando recursos diferentes, como threads, pools de conexão ou até mesmo máquinas separadas. Dessa forma, se um compartimento falhar ou for sobrecarregado, os outros compartimentos podem continuar funcionando normalmente.

o padrão Bulkhead visa isolar e limitar os danos causados por falhas em uma parte do sistema, impedindo que essas falhas se propaguem para outras partes.

A nossa solução de fazer a consulta no serviço de cliente, fere esse padrão, pois não temos o isolamento dos serviços, já que o serviço de remessa depende diretamente do serviço de cliente.

Para isso podemos aplicar o padrão Event-Carried State Transfer.

Event-Carried State Transfer

Esse padrão é um variação do padrão State Transfer. É um padrão arquitetural utilizado em sistemas distribuídos para manter o estado consistente entre diferentes componentes ou serviços e consiste em utilizar um evento para agregar dados a um serviço.

Para o nosso exemplo, podemos utilizar este padrão para remover a dependência do serviço de remessa ao serviço de cliente, replicando os dados do cliente para sua base de dados a partir dos eventos de domínio.

Conslusão

Portanto, ao considerar os desafios enfrentados na integração de microsserviços e a necessidade de garantir a resiliência do sistema, é crucial adotar abordagens arquiteturais adequadas. Enquanto o padrão Bulkhead oferece uma estratégia eficaz para isolar e limitar falhas em diferentes partes do sistema, a dependência direta entre serviços pode comprometer esse isolamento. A implementação do padrão Event-Carried State Transfer surge como uma solução promissora para remover essas dependências, permitindo a transferência de dados relevantes por meio de eventos de domínio. Ao adotar essa abordagem, os microsserviços podem operar de forma mais independente e resiliente, contribuindo para a estabilidade e eficiência do sistema como um todo.

--

--