Comunicação Simples com RabbitMQ Usando .NET Moderno



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

🧱 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

  1. Inicie o consumidor primeiro (dotnet run em Consumer)
  2. Depois, execute o produtor (dotnet run em Producer)
  3. 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