Esse é um exemplo básico de controle e comunicação com RabbitMQ utilizando o package RawRabbit e MediatR no .NET Core 3.1, mas antes vou explicar um pouco sobre cada um.
MediatR
O package MediatR foi criado por Jimmy Bogart (Mesmo criador do package Automapper) que permite processar solicitações em memória (Commands) e notificações (Events). Com ele é possível trabalhar com o conceito CQS (separação de comandos que alteram o estado e consultas que não alteram o estado, criado por Bertrand Meyer).
Ele nos ajudará a mediar as mensagens recebidas e enviadas para o RabbitMQ para que sejam processadas de forma assíncrona.
Mais detalhes: https://github.com/jbogard/MediatR/wiki
RawRabbit
A escolha de um barramento de serviço que atenda aos nossos requisitos é uma parte crucial no desenvolvimento de um sistema distribuído. Neste exemplo utilizaremos o RabbitMQ como serviço (será necessário criar uma conta gratuita em https://www.cloudamqp.com).
O package RawRabbit é a abstração mais simples para trabalhar com o RabbitMQ, com ele fica muito fácil configurar e consumir um barramento AMQP. Neste exemplo utilizaremos a versão 2.0.0-rc5
Mais detalhes: https://github.com/pardahlman/RawRabbit/tree/2.0/docs
Agenda
- Criação da conta RabbitMQ no CloudAMQP
- Configuração do CloudAMQP no projeto WebApiSender e WebApiConsumer com o package RawRabbit
- Exemplo de utilização
1.1 — Abra o site CloudAMQP (https://www.cloudamqp.com) e clique em Sign Up
1.2 — Entre com seu e-mail ou conecte-se com sua conta Google ou Github
1.3 — Com sua conta criada, clique em Create New Instance
1.4 — Inclua o nome da sua instância, selecione o plano Little Lemur(Free) e cliquem em Select Region
1.5 — Selecione o Data Center SA-East-1 (São Paulo) e clique em Review
1.6 — Por fim, clique em Create Instance
2.1 — Baixe a solução (link no final deste post) e configure o appsetting.json do projeto Api.Sample.WebApiSender e Api.Sample.WebApiConsumer:
2.2 — Todas informações com “xxxxxx” você encontra no painel de gerenciamento do CloudAMQP criado:
3.1 — Configure a solução para iniciar as duas APIs ao executar (Clique com o botão direito na solução do Visual Studio e selecione Properties):
3.2 — Ao executar a solução, é possível acompanhar o funcionamento das duas APIs com o package Serilog configurado
Na solução de exemplo, o projeto Api.Sample.WebApiSender envia uma mensagem com o texto “OK” para o RabbitMQ que encaminha para quem estiver escutando o evento SampleCreatedEvent, esta configuração é feita no arquivo BusSubscriber.cs onde é feito o subscribe do evento que é definido como Topic, conforme código abaixo:
A classe criada com o MediatR que escuta o evento SampleCreatedEvent é:
E quem envia a mensagem é a Controller Sender:
Para testar o exemplo basta executar a controller sender, que simplesmente envia uma mensagem do tipo SampleCreatedEvent para o RabbitMQ
Repare que no projeto Consumer é apresentado a mensagem “SampleCreated = OK” funcionando conforme o esperado.
O exemplo final do código e com mais detalhes você confere aqui: https://github.com/hgmauri/sample-rawrabbit-mediatr