Este artigo é uma continuação da primeira parte:
Nesta segunda parte, aprenderemos como configurar e utilizar o Worker Service para receber mensagens do barramento RabbitMQ, trabalhando como um módulo separado da aplicação com a finalidade de processar eventos.
Pré-requisitos
- Visual Studio 2022 (.NET 6.0)
- Docker
- Nuget package Serilog, MassTransit.RabbitMQ e MassTransit.AspNetCore
API
O primeiro passo é configurar o docker-compose com a imagem do RabbitMQ (que é um dos message broker de código aberto mais populares). Basicamente, ele oferece à suas aplicações uma plataforma comum para enviar e receber mensagens, garantindo que os dados nunca sejam perdidos e recebidos com êxito pelos consumidores, além de oferecer suporte a vários protocolos de mensagens.
version: '3.4'
services:
rabbitmq:
image: masstransit/rabbitmq
ports:
- 5672:5672
- 15672:15672
Em seguida é preciso configurar a classe program.cs da API:
Onde o método AddMassTransitPublisher() contém o código de conexão com o RabbitMQ:
Neste código temos o método de extensão Host() responsável por registrar o servidor RabbitMQ, que está configurado no appsettings.json:
"ConnectionStrings": {
"RabbitMq": "amqp://guest:guest@localhost:5672"
}
E finalmente, precisamos configurar o envio de mensagens no controller ClientController:
O IPublishEndpoint é a interface genérica responsável pelo envio de mensagens. Independente do provedor escolhido (In Memory, RabbitMQ, Azure Service Bus, etc).
Worker Service
Neste exemplo, criaremos dois workers que receberão mensagens enviadas do RabbitMQ para processar o cliente salvo e enviar um e-mail.
Configure a classe program.cs com o código abaixo:
O consumer QueueClientSaved e QueueSendEmail possuem o mesmo objeto de entrada, ou seja, ao publicar o evento no controller, os dois consumidores vão processar a mesma mensagem simultaneamente.
A classe QueueClientSaved.cs contém o seguinte código:
E a classe QueueSendEmail.cs contém o seguinte código:
Testando
Para realizar os testes é preciso configurar a solução com a inicialização simultânea do projeto Api e Worker, e executar o comando docker-compose na pasta raiz do projeto ativar o RabbitMQ:
docker-compose up
Com as duas aplicações em execução, realize o teste via Swagger chamando o endpoint POST /client:
E como resultado, os dois workers processaram as mensagens paralelamente.
Finalizando
Trabalhar com o Worker Service recebendo eventos de uma barramento é uma ótima estratégia para modularizar sua aplicação, deixando trechos do código especialistas em pequenas ações, sendo passível de escalar somente o necessário e praticando o desacoplamento da solução.
Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-worker-service