This content originally appeared on DEV Community and was authored by Danilo O. Pinheiro, dopme.io
A integração entre aplicações .NET e RabbitMQ é uma poderosa forma de implementar mensageria assíncrona, desacoplamento de serviços e resiliência em sistemas distribuídos. Neste artigo, vamos explorar como realizar uma comunicação simples com RabbitMQ utilizando .NET 7 ou .NET 8, com um exemplo prático de produtor e consumidor de mensagens.
O Que é o RabbitMQ?
O RabbitMQ é um broker de mensagens baseado no protocolo AMQP, usado para troca segura de mensagens entre serviços. Ele permite que produtores enviem mensagens para filas, e consumidores leiam essas mensagens de forma desacoplada e escalável.
Tecnologias Utilizadas
- .NET 7 ou .NET 8
- RabbitMQ
- Docker (opcional)
- Biblioteca:
RabbitMQ.Client
Subindo o RabbitMQ com Docker
docker run -d --hostname my-rabbit --name rabbitmq \
-p 5672:5672 -p 15672:15672 \
rabbitmq:3-management
- Acesse a interface: http://localhost:15672
Usuário:
guest
Senha:guest
Estrutura do Projeto
RabbitMQDemo/
├── Producer/ # Envia mensagens
│ └── Program.cs
├── Consumer/ # Consome mensagens
│ └── Program.cs
└── Shared/
└── Mensagem.cs # Modelo comum
Adicionando o Pacote
Em ambos os projetos (Producer
e Consumer
):
dotnet add package RabbitMQ.Client
Modelo Compartilhado – Shared/Mensagem.cs
namespace Shared;
public class Mensagem
{
public string Conteudo { get; set; } = string.Empty;
public DateTime CriadoEm { get; set; } = DateTime.UtcNow;
}
Produtor – Producer/Program.cs
using RabbitMQ.Client;
using System.Text;
using System.Text.Json;
using Shared;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "fila_teste", durable: false, exclusive: false, autoDelete: false);
var mensagem = new Mensagem { Conteudo = "Olá do .NET com RabbitMQ!" };
var corpo = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(mensagem));
channel.BasicPublish(exchange: "", routingKey: "fila_teste", basicProperties: null, body: corpo);
Console.WriteLine($"Mensagem enviada: {mensagem.Conteudo}");
Consumidor – Consumer/Program.cs
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Text.Json;
using Shared;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "fila_teste", durable: false, exclusive: false, autoDelete: false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var corpo = ea.Body.ToArray();
var mensagem = JsonSerializer.Deserialize<Mensagem>(Encoding.UTF8.GetString(corpo));
Console.WriteLine($"Mensagem recebida: {mensagem?.Conteudo} em {mensagem?.CriadoEm}");
};
channel.BasicConsume(queue: "fila_teste", autoAck: true, consumer: consumer);
Console.WriteLine("Aguardando mensagens. Pressione [Enter] para sair.");
Console.ReadLine();
Boas Práticas
- Utilize
durable: true
para persistência da fila - Use ack manual (
autoAck: false
) em cenários críticos - Externalize as configs via
appsettings.json
- Modele a mensagem com contratos explícitos (DTOs ou eventos)
Testando
- Inicie o consumidor primeiro (
dotnet run
emConsumer
) - Depois, execute o produtor (
dotnet run
emProducer
) - Verifique os logs do consumidor recebendo a mensagem
Aplicações Comuns
- Orquestração de serviços
- Integração entre microsserviços
- Filas de e-mails, SMS, notificações
- Processamento de eventos e tarefas assíncronas
Complementos Recomendados
- MassTransit ou Rebus para abstrair o RabbitMQ com mensagens/eventos tipados
- Polly para resiliente retry
- OpenTelemetry para rastreamento distribuído
Conecte-se Comigo
Estou sempre aberto a trocar ideias e aprender com a comunidade. Se você também está explorando o C# 13 ou outras tecnologias, vamos nos conectar:
This content originally appeared on DEV Community and was authored by Danilo O. Pinheiro, dopme.io