Escalando aplicações com o Worker Service no .NET 6.0 – Parte 2

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

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:

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 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

Deixe uma resposta