Este projeto é um tutorial prático e completo de RabbitMQ usando .NET 7, demonstrando todos os principais padrões de mensageria com exemplos reais de um sistema de e-commerce.
- Sobre o RabbitMQ
- Pré-requisitos
- Instalação do RabbitMQ
- Estrutura do Projeto
- Padrões Implementados
- Como Executar
- Executando com Docker
- Testando o Projeto no Docker
- Exemplos Práticos
- Conceitos Importantes
- OPCOES-DETALHADAS.md - Explicação completa de cada opção do projeto
- EXEMPLOS-PRATICOS.md - Outputs esperados e passo a passo
- DOCKER.md - Guia completo do Docker
- INICIO-RAPIDO.md - Setup em 5 minutos
- COMANDOS.md - Comandos úteis e troubleshooting
RabbitMQ é um message broker (intermediário de mensagens) que implementa o protocolo AMQP (Advanced Message Queuing Protocol). Ele permite que aplicações se comuniquem de forma assíncrona através de filas de mensagens.
- Producer: Envia mensagens
- Consumer: Recebe e processa mensagens
- Queue: Armazena mensagens
- Exchange: Roteia mensagens para filas
- Routing Key: Critério de roteamento
- Binding: Ligação entre exchange e fila
- .NET 7 SDK
- RabbitMQ Server
- Visual Studio ou VS Code (opcional)
# Instalar Erlang (dependência do RabbitMQ)
choco install erlang
# Instalar RabbitMQ
choco install rabbitmq
# Iniciar o serviço
rabbitmq-service start
# Habilitar interface web (opcional)
rabbitmq-plugins enable rabbitmq_management
- Baixe e instale Erlang: https://www.erlang.org/downloads
- Baixe e instale RabbitMQ: https://www.rabbitmq.com/download.html
- Inicie o serviço RabbitMQ
# Método 1: Usando o script helper
.\docker-setup.bat
# ou
.\docker-setup.ps1
# Método 2: Docker Compose direto
docker-compose -f docker-compose.dev.yml up -d
# Método 3: Comando direto
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
- Interface Web: http://localhost:15672 (admin/admin)
- Porta AMQP: 5672
RabbitMQ/
├── RabbitMQ.sln # Solution principal
├── RabbitMQ.Shared/ # Projeto compartilhado
│ ├── Models/ # Modelos de mensagens
│ ├── RabbitMQConnectionFactory.cs
│ └── QueueNames.cs # Constantes de filas e exchanges
├── RabbitMQ.Producer/ # Aplicação producer
│ ├── Producers/ # Diferentes tipos de producers
│ └── Program.cs # Menu interativo
└── RabbitMQ.Consumer/ # Aplicação consumer
├── Consumers/ # Diferentes tipos de consumers
└── Program.cs # Menu interativo
- Uso: Comunicação 1:1 básica
- Exemplo: Processamento de tarefas simples
- Características: Uma mensagem → um consumer
- Uso: Distribuição de tarefas pesadas
- Exemplo: Processamento de imagens, relatórios
- Características: Múltiplos workers, distribuição round-robin
- Uso: Broadcast de notificações
- Exemplo: Alertas do sistema, newsletters
- Características: Uma mensagem → todos os subscribers
- Uso: Roteamento por categoria exata
- Exemplo: Sistema de logs por nível (INFO, WARNING, ERROR)
- Características: Routing key exata
- Uso: Roteamento por padrões flexíveis
- Exemplo: Eventos de negócio (user.*, order.created)
- Características: Wildcards (* e #)
- Uso: Sistema real de pedidos
- Exemplo: Processamento de pedidos com validação, estoque, pagamento
- Características: Objetos complexos, ACK manual, retry
cd c:\Users\silvi\Desktop\Rabbitmq
dotnet restore
dotnet build
cd RabbitMQ.Producer
dotnet run
cd RabbitMQ.Consumer
dotnet run
- No Producer, escolha um exemplo (1-6)
- No Consumer, inicie o consumer correspondente
- Observe as mensagens sendo processadas
// Producer
var producer = new SimpleQueueProducer();
await producer.SendMessage("Olá RabbitMQ!");
// Consumer
var consumer = new SimpleQueueConsumer();
await consumer.StartListening();
// Producer
var producer = new WorkQueueProducer();
await producer.SendTask("Tarefa pesada #1");
// Consumer (execute múltiplas instâncias)
var consumer = new WorkQueueConsumer(workerId: 1);
await consumer.StartListening();
// Producer
var order = new OrderMessage
{
OrderId = "ORD-001",
CustomerName = "João Silva",
Amount = 299.99m,
Products = new List<string> { "Smartphone", "Capinha" }
};
await producer.SendOrder(order);
// Consumer
var consumer = new OrderConsumer();
await consumer.StartListening();
- Filas Duráveis: Sobrevivem a reinicializações do servidor
- Mensagens Persistentes: Salvas em disco
- prefetchCount: Limita mensagens não confirmadas por consumer
- Uso: Garante distribuição equilibrada
- Auto ACK: Mensagem é removida da fila imediatamente
- Manual ACK: Consumer confirma processamento
- NACK: Rejeita mensagem (pode devolver à fila)
- Direct: Routing key exata
- Fanout: Broadcast para todas as filas
- Topic: Padrões com wildcards
- Headers: Baseado em headers da mensagem
- Direct: "error", "warning", "info"
- Topic: "user.created", "order.", ".important"
- Wildcards:
*
= exatamente uma palavra#
= zero ou mais palavras
- Requeue: Mensagem volta para a fila
- Dead Letter: Mensagens rejeitadas vão para fila especial
- TTL: Time-to-live para mensagens
- URL: http://localhost:15672
- Login: guest/guest
- Overview: Estatísticas gerais
- Connections: Conexões ativas
- Channels: Canais ativos
- Exchanges: Exchanges declarados
- Queues: Filas e estatísticas
- Messages Ready: Mensagens aguardando processamento
- Messages Unacknowledged: Mensagens sendo processadas
- Message Rates: Taxa de entrada/saída
- Consumer Count: Número de consumers ativos
-
Erro de Conexão
- Verificar se RabbitMQ está rodando
- Verificar porta 5672
- Verificar credenciais (guest/guest)
-
Mensagens Não Chegam
- Verificar binding entre exchange e fila
- Verificar routing key
- Verificar se consumer está ativo
-
Performance
- Configurar QoS adequadamente
- Usar ACK manual quando necessário
- Monitorar uso de memória
# Verificar status do RabbitMQ
rabbitmqctl status
# Listar filas
rabbitmqctl list_queues
# Listar exchanges
rabbitmqctl list_exchanges
# Limpar uma fila
rabbitmqctl purge_queue nome_da_fila
- Implementar Dead Letter Queues
- Adicionar TTL nas mensagens
- Implementar Circuit Breaker
- Adicionar logging estruturado
- Criar dashboards de monitoramento
- Implementar retry com backoff
- Adicionar autenticação/autorização
- Usar clusters RabbitMQ
Sinta-se à vontade para contribuir com melhorias, correções ou novos exemplos!
Este projeto é para fins educacionais.
Feito com ❤️ para aprender RabbitMQ com .NET
O projeto inclui configuração completa para Docker, facilitando a execução em qualquer ambiente.
# Iniciar apenas RabbitMQ
docker-compose -f docker-compose.dev.yml up -d
# Executar aplicações localmente
cd RabbitMQ.Consumer
dotnet run
# Em outro terminal
cd RabbitMQ.Producer
dotnet run
# Construir e iniciar tudo
docker-compose up -d --build
# Interagir com as aplicações
docker exec -it rabbitmq-consumer bash
docker exec -it rabbitmq-producer bash
# Iniciar com 3 workers adicionais
docker-compose --profile workers up -d --build
# Windows Batch
.\docker-setup.bat
# PowerShell
.\docker-setup.ps1
# Makefile (se disponível)
make run-dev # Apenas RabbitMQ
make run-full # Ambiente completo
make run-workers # Com múltiplos workers
make stop # Parar tudo
make clean # Limpar volumes
- Interface Web: http://localhost:15672
- Credenciais: admin / admin123
- Status:
docker ps
oumake status
# Execute o script de teste
.\test-docker.bat
O script oferece testes pré-configurados para todos os padrões.
# Terminal 1 - Consumer
docker exec -it rabbitmq-consumer bash
dotnet RabbitMQ.Consumer.dll
# Escolha um consumer (ex: 1 para Simple Queue)
# Terminal 2 - Producer
docker exec -it rabbitmq-producer bash
dotnet RabbitMQ.Producer.dll
# Escolha o producer correspondente (ex: 1 para Simple Queue)
- URL: http://localhost:15672
- Login: admin / admin123
- Funcionalidades:
- Ver filas em tempo real
- Monitorar mensagens
- Estatísticas de performance
- Gerenciar exchanges e bindings
# Consumer: Opção 1
# Producer: Opção 1
# Resultado: Mensagens 1:1
# Para múltiplos workers, execute:
docker-compose --profile workers up -d --build
# Consumer: Opção 2 (escolha 3 workers)
# Producer: Opção 2
# Resultado: Distribuição automática entre workers
# Abra 3 terminais de Consumer
# Todos escolhem Opção 3 (nomes diferentes)
# Producer: Opção 3
# Resultado: Todos recebem as mesmas mensagens
# Consumer: Opção 6
# Producer: Opção 6
# Resultado: Processamento completo de pedidos
# Ver logs em tempo real
docker logs rabbitmq-consumer -f
docker logs rabbitmq-producer -f
docker logs rabbitmq-tutorial -f
# Status dos containers
docker ps --filter "name=rabbitmq"
# Executar comandos únicos
docker exec rabbitmq-consumer dotnet --version
docker exec rabbitmq-producer dotnet --version
# Limpar filas via CLI
docker exec rabbitmq-tutorial rabbitmqctl purge_queue simple_queue
# Estatísticas via API
curl -u admin:admin123 http://localhost:15672/api/queues
# Verificar logs
docker logs rabbitmq-consumer
docker logs rabbitmq-producer
# Reiniciar container
docker restart rabbitmq-consumer
# Verificar health do RabbitMQ
docker inspect rabbitmq-tutorial | grep Health
# Reiniciar RabbitMQ
docker restart rabbitmq-tutorial
# Verificar recursos
docker stats
# Ver estatísticas do RabbitMQ
curl -u admin:admin123 http://localhost:15672/api/overview