Event Bus

Imagem de exemplo sobre Event Bus

Você já implementou esse padrão em algum projeto? Veja como é interessante e simples. Podemos transformar completamente o comportamento da nossa aplicação!

Imagine ter uma aplicação de grande escala contendo muitas classes interagindo entre si, e você deseja uma maneira de fazer com que essas classes se comuniquem, mantendo os princípios de baixo acoplamento e separação de responsabilidades. O padrão Event Bus pode ser uma excelente solução para o seu problema.

A ideia de um barramento de eventos é bastante semelhante ao barramento estudado em redes (topologia de barramento). Você tem algum tipo de pipeline e computadores conectados a ele, e sempre que um deles envia uma mensagem, ela é despachada para todos os outros. Em seguida, eles decidem se desejam consumir a mensagem fornecida ou apenas descartá-la.

Imagem de exemplo barramentos

No nível dos componentes, a lógica é bastante semelhante: os computadores são os componentes do seu aplicativo, a mensagem é o evento ou os dados que você deseja comunicar e o pipeline é o seu objeto EventBus.

Agora que temos uma definição do que é um barramento de eventos, vamos colocar a mão na massa e aplicar um exemplo simples de como podemos usá-lo.

Imagine que temos uma aplicação que cadastra usuários e, sempre que um novo usuário é cadastrado no sistema, precisamos realizar algumas ações, como enviar um e-mail ou notificar outros sistemas.

Neste exemplo, vamos exibir no console do terminal os dados publicados no evento.

Utilizaremos o framework NestJS com a seguinte estrutura de projeto:

src/
── common/                   # Pacote de arquivos compartilhados
── email-handlers/           # Módulo do serviço que simula o envio de e-mail
── event-bus/                # Módulo do event-bus
── user/                     # Módulo de usuário

Para implementar o event-bus em nosso projeto de exemplo, utilizaremos a biblioteca RxJS (Reactive Extensions for JavaScript), conhecida por sua programação reativa em JavaScript. Ela é especialmente útil para lidar com fluxos de eventos assíncronos de maneira simples e declarativa.

Aqui está a implementação do serviço em nosso módulo Event Bus. Nele, teremos os métodos publish e ofType, que nos permitem enviar e receber eventos de forma intuitiva.

Imagem com o primeiro examplo

Estamos criando nosso primeiro modelo de evento. Este modelo será responsável por garantir que todos os eventos do tipo AccountRegistrationEvent contenham os dados do usuário e o tipo de evento. É importante lembrar que esses campos são totalmente personalizáveis.

Imagem com o primeiro examplo

Criamos uma rota responsável pelo cadastro de usuários. Cada vez que um usuário é criado, um novo evento é publicado para informar ao sistema sobre os dados desse novo usuário

Imagem com o primeiro examplo

Agora que estamos publicando eventos, precisamos nos inscrever para poder realizar ações.

Desenvolvemos um módulo chamado email-handlers para simular um serviço de envio de e-mail. Por enquanto, vamos apenas exibir os logs dos eventos para demonstrar que tanto a publicação quanto a inscrição nesses eventos estão funcionando.

Imagem com o primeiro examplo

A partir de agora, sempre que o evento for recebido, ele será registrado no log, conforme mostrado na imagem abaixo:

Imagem com o primeiro examplo

A implementação do Event Bus pode ser benéfica para sua base de código, pois ajuda a acoplar livremente suas classes e promove um padrão de publicação-assinatura. Também ajuda os componentes a interagirem sem estarem cientes uns dos outros.

Todos os exemplos de código e implementação podem ser encontrados neste repositório.