Mensageria com ASP.NET Core, MassTransit, e RabbitMQ

Se você está trabalhando com aplicações em escala ou distribuídas, você provavelmente já se deparou com o conceito de mensageria. Em resumo, um sistema de mensagens permite que as aplicações trabalhem juntas, mas permaneçam desacopladas. É um modelo de comunicação assíncrona que é especialmente útil para comunicação entre microserviços.

Neste artigo, vamos introduzir o MassTransit, uma biblioteca de mensagens de código aberto para .NET que pode ser usada em conjunto com RabbitMQ e ASP.NET Core API para criar sistemas robustos e escaláveis.

O que é Mensageria?

Mensageria é uma maneira de permitir a comunicação entre diferentes sistemas ou componentes de software de forma desacoplada. Essa comunicação é realizada principalmente através do envio de mensagens – pacotes de dados que contêm informações. Em vez de se comunicarem diretamente uns com os outros, os componentes do software enviam mensagens para uma fila, e outros componentes podem então pegar essas mensagens e processá-las.

A vantagem deste modelo é que permite a comunicação assíncrona entre os componentes. Ou seja, um componente pode enviar uma mensagem e continuar com seu trabalho, sem precisar esperar que o receptor processe a mensagem. Isso é útil para operações que podem levar muito tempo, como requisições via rede ou acesso ao banco de dados.

Conhecendo o MassTransit

Agora que entendemos o conceito de mensageria”, vamos falar sobre o MassTransit. Esta é uma biblioteca de mensagens para .NET, que oferece uma interface simplificada e integrada para lidar com sistemas de mensagens.

O MassTransit fornece uma camada de abstração sobre os sistemas de mensagens subjacentes, como o RabbitMQ. Isso significa que você pode trabalhar com objetos e métodos de alto nível em seu código, sem precisar se preocupar com os detalhes de baixo nível do sistema de mensagens. Ele também tem suporte a Azure Service Bus e Amazon SQS.

Isso acaba resultando em um uso mais simples e prático do que utilizando bibliotecas como o RabbitMQ.Client. Porém, é importante entender que quando utilizamos uma biblioteca como o MassTransit, estamos sujeitos a convenções aplicadas pela mesma, e que acabamos tendo menos controle como se tivéssemos com outros bibliotecas.

Um dos principais benefícios do MassTransit é que ele oferece recursos avançados, como suporte para mensagens de publish/subscribe, envio de mensagens atrasadas, e a capacidade de criar pipelines de mensagens. Além disso, o MassTransit tem suporte embutido para transações, de modo que você pode garantir que as mensagens sejam entregues e processadas de forma confiável.

Integrando MassTransit, RabbitMQ e ASP.NET Core

O primeiro passo é garantir que o RabbitMQ esteja sendo executado em sua máquina. O ideal é que seja utilizando o Docker, pela portabilidade e facilidade de criar e apagar instâncias de containers de serviços. O código abaixo mostra como iniciar um container Docker do RabbitMQ e sua interface de gerenciamento.

docker run -p 15672:15672 -p 5672:5672 masstransit/rabbitmq

Nesse caso utilizamos a imagem do RabbitMQ que é mantida pelo próprio time do MassTransit, que contém a interface de gerenciamento já ativada e também recursos adicionais.

Vamos agora para o projeto ASP.NET Core API. Começamos pela instalação dos pacotes NuGet necessários, os quais coloco abaixo:

MassTransit.RabbitMQ

MassTransit.Extensions.DependencyInjection

Com isso, vamos criar uma classe que vai ser utilizada para armazenar dados de evento de compra fictícia.

Classe de evento OrderCreated

Já que temos a classe de evento e os pacotes relacionados ao MassTransit instalados, podemos criar nossa classe responsável pelo consumo dessas informações. Para isso, basta herdar de IConsumer<T>, onde T é o tipo da mensagem a ser recebida.

Classe consumidora do evento OrderCreated

Com a parte de consumo implementada, vamos para a parte de publicação. Veja como é simples utilizar a interface IBus do MassTransit para publicar uma mensagem a partir de uma Action de nosso Controller.

Publicando uma mensagem no RabbitMQ a partir da Action

Finalmente, concluímos nosso tutorial com a configuração na classe Program, especificando os consumidores.

Configuração na Program

Com isso feito, conseguimos realizar uma requisição em nosso endpoint da API, e uma mensagem é publicada e consumida com sucesso através do RabbitMQ.


Quer acelerar seus resultados?

Além de trabalhar para o exterior como Desenvolvedor .NET Sênior, eu sou instrutor e mentor de centenas de desenvolvedores .NET que querem acelerar seus resultados e se destacar em suas carreiras.

O meu treinamento Imersão .NET Expert é uma assinatura com mais de 800 videoaulas e 200 horas de cursos focados em profissionais .NET Plenos e Seniores.

Entre os temas de cursos estão Microsserviços, DevOps, Performance, APIs, entre outros tantos.

Está com R$1.000 de desconto, e você pode conhecer mais e garantir sua vaga clicando aqui.


Conclusão

Em suma, o MassTransit, em conjunto com o RabbitMQ e o ASP.NET Core, oferece uma abordagem poderosa e flexível para a construção de sistemas baseados em mensagens. Ele permite que você crie aplicações desacopladas, escaláveis e resilientes, aproveitando ao máximo os benefícios da comunicação assíncrona.

No entanto, como sempre, é importante lembrar que cada ferramenta tem seus pontos fortes e fracos, e é essencial entender suas necessidades e requisitos específicos antes de tomar uma decisão. O MassTransit é uma solução poderosa e rica em recursos, mas, dependendo do caso, outras opções podem ser mais adequadas.

Nós cobrimos apenas a superfície do que é possível fazer com o MassTransit, RabbitMQ e ASP.NET Core. Espero que este artigo tenha fornecido uma introdução útil a essas tecnologias e estimulado seu interesse em aprender mais.

Vamos que vamos!