Já ouviram falar sobre EDA ou Arquitetura Orientada a Eventos (Event driven architecture) ?? Vamos nesse artigo passar por alguns conceitos e ver um exemplo prático para fixação.
Navegue pelo conteúdo deste artigo
Conceitos da Arquitetura Orientada a Eventos – EDA
Trata-se de um padrão de design arquitetural assíncrono e distribuído.
Usamos EDA para produzir aplicações altamente escaláveis e de alta performance, é uma arquitetura desacoplada, ou seja, os integrantes desta arquitetura publicam ou processam eventos sem saber os detalhes de quem emite (publica) ou de quem ouve (subscriber).
Basicamente a EDA consiste em serviços produtores e serviços consumidores de eventos. Para produzir eventos é necessário que entre na jogada um serviço de broker, temos alguns brokers disponíveis no mercado como por exemplo o RabbitMQ e o Kafka.
Tá bom..mas o que é um evento? podemos dizer que é qualquer ocorrência ou mudança significativa no software ou hardware de um sistema. Uma notificação de evento é algo enviado por algum sistema para avisar outra parte interessada que algo mudou ou ocorreu.
Exemplo: Um usuário cancela o pedido feito em um ecommerce, este “ato” do usuário gerou um evento de cancelamento de pedido. Esse evento vai desencadear uma sequencia de outros eventos dentro de um projeto.
Quais são os benefícios de usar EDA?
- Ser altamente escalável
- Custo e eficiência de recurso
- Tolerância a falhas
- É fácil implementar novos integrantes (consumidores ou produtores);
- Suporta grande carga e múltiplos usuários
- Totalmente desacoplado (produtores e consumidores não se conhecem)
Temos que ter em mente também os desafios que a EDA traz (aplicações distribuídas) como lidar com Logs e Tracing (rastreabilidade).
Para exemplificar o uso e a criação de uma arquitetura orientada a eventos vamos criar uma estrutura bem simples em .NET CORE e usar o Kafka como broker.
Configurando o Docker para o exemplo prático
A primeira ação é configurar o Kafka para rodar na sua maquina, a forma mais fácil é usar o Docker, não vou entrar aqui neste post sobre como instalar e utilizar a ferramenta para isso temos vários recursos na internet que ensinam como.
Entendendo que o Docker está rodando em sua máquina vamos usar o arquivo docker-compose.yml abaixo:

Este arquivo vai criar os softwares necessários para rodar nosso exemplo, esse arquivo vai criar três aplicações:
- O Kafka (broker);
- O Zookeeper (Para o Kafka funcionar é necessário ter o Zookeeper rodando);
- O Kafdrop (uma interface web para visualizar os tópicos e eventos dentro do Kafka
Para rodar o docker-compose.yml basta utilizar o comando (dentro da pasta do arquivo), este comando irá fazer o download das imagens necessárias:
docker compose pull
Depois de baixar as imagens vamos subir os containers utilizando o comando abaixo, ele vai subir os três containers em background:
docker start $(docker ps -a -q)
Se abrir a interface do Docker teremos as três aplicações no ar:

Com essa etapa concluída, temos o Kafka rodando na porta 9092 e o Kafdrop vai rodar na porta 19000:

Vamos agora criar duas aplicações .NET CORE, o publicador e o consumidor de mensagens. A ideia é que o publicador envie para o broker mensagens do tipo ORDER (representa uma ação do mercado financeiro) e o consumidor receba esses objetos e escreva em tela o recebimento, bem simples!
Criando a aplicação produtora
Dentro de uma pasta de sua preferência vamos digitar o seguinte comando:
dotnet new web -o ExKafka.Producer.API
Este comando irá gerar uma aplicação do tipo WebAPI e a estrutura deverá ser essa:

Agora vamos adicionar a este projeto duas classes: Order.cs e ProducerService.cs, mas antes precisamos adicionar as referencias necessárias para trabalhar com o Kafka:
dotnet add package Confluent.Kafka
Agora abra a classe Order.cs e insira os seguintes comandos:

Vamos agora a classe ProducerService.cs

Agora vamos alterar a classe Program.cs:

Agora para finalizar vamos inserir as configurações necessárias em nosso appsettings.json:

Pronto agora vamos rodar nosso projeto com o comando:
dotnet run --urls=https://localhost:5001
Se tudo correr bem vai ver essa saída:

Vamos agora “produzir” nosso primeiro evento e testar se tudo correu bem, para isso vou utilizar o Insomnia (pode utilizar o Postman ou outra ferramenta para consumo de API que preferir). Criei um Post bem simples:

Como voltou “200” podemos entender que tudo correu certo e que conseguimos inserir um evento no Kafka, para ter certeza vamos ver no Kafdrop se temos algum evento registrado (note no final que temos a mensagem enviada):

Nosso produtor de mensagens está pronto..agora vamos ao próximo passo, criar a aplicação consumidora dos eventos.
Criando a aplicação consumidora
Dentro de uma pasta de sua preferência vamos digitar o seguinte comando:
dotnet new console -o ExKafka.Consumer.Console
Este comando irá gerar uma aplicação do tipo Console Application e a estrutura deverá ser essa:

Vamos adicionar as referencias necessárias ao projeto consumidor:
dotnet add package Confluent.Kafka
dotnet add package Microsoft.Extensions.Hosting
O Microsoft.Extensions.Hosting vamos utilizar para deixar o nosso console rodando em background.
Vamos criar agora a classe ConsumerService.cs:

Precisamos agora ter também a classe Order.cs no consumidor:

Para finalizar o projeto consumidor vamos alterar a classe Program.cs:

Pronto agora vamos rodar nosso projeto mas antes vamos lembrar que já tenho dois eventos de ordem no broker:

Para rodar o projeto consumidor basta digitar o comando abaixo, esperamos que quando o projeto iniciar ele já vá lá no nosso broker e resgate as duas ordens que estão na fila:
dotnet run
No meu exemplo aqui deu tudo certo! olhe os logs:

O projeto consumidor encontrou as duas ordens que estavam esperando na fila, com sucesso!
Vamos olhar agora para o Kafdrop e ver o status

Agora você pode rodar as duas aplicações em paralelo (publicador e consumidor), fazer os requests pelo insomnia ou o Postman e ver a mágica acontecendo.

Finalizando o artigo
Pessoal, esse foi um pequeno exemplo de uma arquitetura voltada a eventos, logicamente um exemplo muito mais muito simples com fins apenas didáticos para demonstrar os conceitos e recursos.
Como sempre esse código pode ser encontrado aqui no meu GitHub.
Se curtiu comenta se não curtiu comenta mesmo assim pois qualquer comentário ajuda a melhorar, não esqueça de repassar para seus amigos e até o próximo artigo!