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:
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.