Skip to content

Complete RabbitMQ + .NET learning project with multiple messaging patterns, Docker support and comprehensive documentation

Notifications You must be signed in to change notification settings

sfcdsfcd/rabbitmq-dotnet-learning

Repository files navigation

RabbitMQ com .NET - Tutorial Completo

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.

📋 Índice

📚 Documentação Adicional

🐰 Sobre o RabbitMQ

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.

Principais Conceitos:

  • 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

🔧 Pré-requisitos

  • .NET 7 SDK
  • RabbitMQ Server
  • Visual Studio ou VS Code (opcional)

📦 Instalação do RabbitMQ

Windows (via Chocolatey)

# 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

Windows (Download direto)

  1. Baixe e instale Erlang: https://www.erlang.org/downloads
  2. Baixe e instale RabbitMQ: https://www.rabbitmq.com/download.html
  3. Inicie o serviço RabbitMQ

Docker (Alternativa Recomendada)

# 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

Verificação

🏗️ Estrutura do Projeto

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

🎯 Padrões Implementados

1. Simple Queue (Fila Simples)

  • Uso: Comunicação 1:1 básica
  • Exemplo: Processamento de tarefas simples
  • Características: Uma mensagem → um consumer

2. Work Queue (Fila de Trabalho)

  • Uso: Distribuição de tarefas pesadas
  • Exemplo: Processamento de imagens, relatórios
  • Características: Múltiplos workers, distribuição round-robin

3. Publish/Subscribe (Fanout)

  • Uso: Broadcast de notificações
  • Exemplo: Alertas do sistema, newsletters
  • Características: Uma mensagem → todos os subscribers

4. Direct Routing

  • Uso: Roteamento por categoria exata
  • Exemplo: Sistema de logs por nível (INFO, WARNING, ERROR)
  • Características: Routing key exata

5. Topic Routing

  • Uso: Roteamento por padrões flexíveis
  • Exemplo: Eventos de negócio (user.*, order.created)
  • Características: Wildcards (* e #)

6. Exemplo E-commerce

  • Uso: Sistema real de pedidos
  • Exemplo: Processamento de pedidos com validação, estoque, pagamento
  • Características: Objetos complexos, ACK manual, retry

🚀 Como Executar

1. Restaurar Dependências

cd c:\Users\silvi\Desktop\Rabbitmq
dotnet restore

2. Compilar Projetos

dotnet build

3. Executar Producer

cd RabbitMQ.Producer
dotnet run

4. Executar Consumer (em outro terminal)

cd RabbitMQ.Consumer
dotnet run

5. Testar os Exemplos

  1. No Producer, escolha um exemplo (1-6)
  2. No Consumer, inicie o consumer correspondente
  3. Observe as mensagens sendo processadas

💡 Exemplos Práticos

Exemplo 1: Simple Queue

// Producer
var producer = new SimpleQueueProducer();
await producer.SendMessage("Olá RabbitMQ!");

// Consumer
var consumer = new SimpleQueueConsumer();
await consumer.StartListening();

Exemplo 2: Work Queue com Múltiplos Workers

// 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();

Exemplo 3: E-commerce

// 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();

📚 Conceitos Importantes

Durabilidade

  • Filas Duráveis: Sobrevivem a reinicializações do servidor
  • Mensagens Persistentes: Salvas em disco

Quality of Service (QoS)

  • prefetchCount: Limita mensagens não confirmadas por consumer
  • Uso: Garante distribuição equilibrada

Acknowledgments (ACK)

  • Auto ACK: Mensagem é removida da fila imediatamente
  • Manual ACK: Consumer confirma processamento
  • NACK: Rejeita mensagem (pode devolver à fila)

Exchanges

  • Direct: Routing key exata
  • Fanout: Broadcast para todas as filas
  • Topic: Padrões com wildcards
  • Headers: Baseado em headers da mensagem

Routing Keys e Patterns

  • Direct: "error", "warning", "info"
  • Topic: "user.created", "order.", ".important"
  • Wildcards:
    • * = exatamente uma palavra
    • # = zero ou mais palavras

Cenários de Erro

  • Requeue: Mensagem volta para a fila
  • Dead Letter: Mensagens rejeitadas vão para fila especial
  • TTL: Time-to-live para mensagens

🔍 Monitoramento

Interface Web do RabbitMQ

  • 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

Métricas Importantes

  • Messages Ready: Mensagens aguardando processamento
  • Messages Unacknowledged: Mensagens sendo processadas
  • Message Rates: Taxa de entrada/saída
  • Consumer Count: Número de consumers ativos

🛠️ Troubleshooting

Problemas Comuns

  1. Erro de Conexão

    • Verificar se RabbitMQ está rodando
    • Verificar porta 5672
    • Verificar credenciais (guest/guest)
  2. Mensagens Não Chegam

    • Verificar binding entre exchange e fila
    • Verificar routing key
    • Verificar se consumer está ativo
  3. Performance

    • Configurar QoS adequadamente
    • Usar ACK manual quando necessário
    • Monitorar uso de memória

Comandos Úteis

# 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

📖 Próximos Passos

  1. Implementar Dead Letter Queues
  2. Adicionar TTL nas mensagens
  3. Implementar Circuit Breaker
  4. Adicionar logging estruturado
  5. Criar dashboards de monitoramento
  6. Implementar retry com backoff
  7. Adicionar autenticação/autorização
  8. Usar clusters RabbitMQ

🤝 Contribuindo

Sinta-se à vontade para contribuir com melhorias, correções ou novos exemplos!

📝 Licença

Este projeto é para fins educacionais.


Feito com ❤️ para aprender RabbitMQ com .NET

🐳 Executando com Docker

O projeto inclui configuração completa para Docker, facilitando a execução em qualquer ambiente.

Opção 1: Desenvolvimento Local (Recomendado)

# 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

Opção 2: Ambiente Completo no Docker

# 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

Opção 3: Múltiplos Workers

# Iniciar com 3 workers adicionais
docker-compose --profile workers up -d --build

Scripts Helper

# 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

Verificação

🧪 Testando o Projeto no Docker

Método 1: Script de Teste Automatizado (Mais Fácil)

# Execute o script de teste
.\test-docker.bat

O script oferece testes pré-configurados para todos os padrões.

Método 2: Acesso Interativo aos Containers

Passo 1: Acessar o Consumer

# Terminal 1 - Consumer
docker exec -it rabbitmq-consumer bash
dotnet RabbitMQ.Consumer.dll

# Escolha um consumer (ex: 1 para Simple Queue)

Passo 2: Acessar o Producer (em outro terminal)

# Terminal 2 - Producer  
docker exec -it rabbitmq-producer bash
dotnet RabbitMQ.Producer.dll

# Escolha o producer correspondente (ex: 1 para Simple Queue)

Método 3: Monitoramento via Interface Web

  • URL: http://localhost:15672
  • Login: admin / admin123
  • Funcionalidades:
    • Ver filas em tempo real
    • Monitorar mensagens
    • Estatísticas de performance
    • Gerenciar exchanges e bindings

Cenários de Teste Recomendados

1. Teste Básico - Simple Queue

# Consumer: Opção 1
# Producer: Opção 1
# Resultado: Mensagens 1:1

2. Teste de Carga - Work Queue

# 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

3. Teste de Broadcast - Publish/Subscribe

# Abra 3 terminais de Consumer
# Todos escolhem Opção 3 (nomes diferentes)
# Producer: Opção 3
# Resultado: Todos recebem as mesmas mensagens

4. Teste Prático - E-commerce

# Consumer: Opção 6
# Producer: Opção 6
# Resultado: Processamento completo de pedidos

Comandos Úteis para Teste

# 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

Troubleshooting

Container não responde

# Verificar logs
docker logs rabbitmq-consumer
docker logs rabbitmq-producer

# Reiniciar container
docker restart rabbitmq-consumer

RabbitMQ não conecta

# Verificar health do RabbitMQ
docker inspect rabbitmq-tutorial | grep Health

# Reiniciar RabbitMQ
docker restart rabbitmq-tutorial

Performance lenta

# Verificar recursos
docker stats

# Ver estatísticas do RabbitMQ
curl -u admin:admin123 http://localhost:15672/api/overview