🇧🇷 Domain Events vs. Integration Events

Construir uma aplicação pode ser complicado as vezes, especialmente se você está desenvolvendo vários domínios e uma interação entre eles é necessária. Para diminuir essas complicações, podemos usar alguns conceitos implementados no sistema.

Neste post vou compartilhar sobre Domain Events e Integration Events, alguns exemplos práticos e relacioná-los ao design de um sistema.

Domain Events

O que Ă© ?
De acordo com Martin Fowler um domain event “captura a memoria de algo interessante que afeta o domínio”.

O que isso significa na prática ?
Vamos supor que John e Mark trabalham juntos na área de vendas de uma empresa e eles tem um trabalho manual parecido com o de um sistema. Primeiro John cria um orçamento a partir de um pedido do cliente e calcula alguns impostos. Depois disso, Mark pega esse papel e envia ao cliente.

Baseado nessa estória podemos observar que o trabalho do Mark é relacionado ao do John, mas não são necessariamente ligados. Por exemplo, Mark poderiam esperar um dia inteiro de orçamento para fazer o envio de uma vez.

Em outras palavras, criar um orçamento é parte do mesmo domínio que a notificação ao cliente sobre o orçamento, mas essas ações não são parte do mesmo processo.

Ao final temos uma “memória” de um orçamento criado que afeta o domínio de vendas culminando no envio do orçamento ao cliente.

E o design da aplicação ?
Eles devem ser implementados dentro do mesmo domínio. Seus contextos devem ser muito bem delimitados. Se fossemos construir uma aplicação para a nossa estória, teríamos o seguinte cenário:

Uma aplicação que recebe um pedido do cliente, calcula os impostos, registra o orçamento e então emite um evento informando que um orçamento foi criado. Um processo secundário se inscreveria nesse evento, começaria a ouvir “orçamentos criados” e então enviaria um e-mail ao cliente.

Quais sĂŁo os benefĂ­cios ?

  • Separação de responsabilidades, fazendo o seu processo de manutenção mais fácil;
  • Bom design de cĂłdigo, usando a linguagem ubĂ­qua;
  • Testabilidade, pois um processo nĂŁo depende do outro.

Integration Events

O que Ă© ?
Um evento que ocorreu com sucesso no passado dentro de um domínio, que pode ser interessante a outros domínios, aplicações ou até serviços de terceiro.

O que isso significa na prática ?
Agora vamos dizer que quando John termina o seu trabalho, ele vai ao departamento de Marketing da empresa e entrega as cópias dos orçamentos. Com essa cópia em mãos, Julia seleciona alguns clientes com boa reputação para enviar um cupom de desconto nas próximas compras.

Adicionando essa parte da estĂłria, podemos notar que Julia Ă© parte de um domĂ­nio diferente, chamado de Marketing.

Também, observe que o mesmo evento de “orçamento criado” aconteceu, mas agora em um domínio diferente. Isso significa que ela não precisa saber como o orçamento foi criado, calculado ou mesmo se foi enviado para o cliente. Ela só precisa fazer o trabalho dela.

E o design da aplicação ?
Esse cenário não está focado no design específico de uma aplicação, mas no design do sistema como um todo. Quando estamos lidando com sistemas distribuídos, podemos pensar em duas aplicações distintas: Vendas e Marketing.

A aplicação de vendas emite um evento “orçamento criado” e a aplicação de Marketing reagiria a esse evento, enviando a campanha de marketing.

Quais sĂŁo os benefĂ­cios ?

  • Separação de responsabilidades no nĂ­vel de sistema, pois o sistema de Vendas nĂŁo quer saber sobre os processos envolvidos em outros sistemas depois de um orçamento criado. E outros domĂ­nios que estĂŁo interessados nesse evento, podem se inscrever sem saber como aconteceu, mas quando aconteceu.
  • Escalabilidade. Se o time de vendas trabalhar duro ao ponto que centenas de orçamentos sĂŁo criados, Ă© possĂ­vel instanciar mais aplicações ouvindo a essa fila de eventos e fazer o trabalho a medida que a carga aumenta.
  • Outro aspecto Ă© que vocĂŞ pode distribuir seus projetos entre os times, tratá-los como produtos separados, e eles poderĂŁo trabalhar, desenvolver, mudar as regras sem incomodar outros times.

Considerações finais

Esses conceitos aumentam a qualidade dos softwares, mas você precisa ser razoável quando desenvolver tais conceitos.

Domain Events e Integration Events podem tornar sua vida mais fácil mas você deve tomar cuidado de quando é necessário. Por exemplo, se você precisa criar uma aplicação CRUD simples, e nada mais está envolvido, certamente você não vai precisar de criar uma arquitetura complexa para lidar com a aplicação. Seja razoável e mantenha simples.

Esse artigo também está disponível em inglês.

Software Engineer and passionate about distributed systems

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store