Análise de Desempenho com Criação Dinâmica de Recursos
Esta é uma Prova de Conceito (POC) desenvolvida para explorar o desempenho do RabbitMQ em cenários extremos de uso, com foco em:
- Criação dinâmica de exchanges, filas e bindings
- Alta carga de mensagens
- Resiliência em falhas
- Thread safety
- Monitoramento e logs estruturados
A POC foi construída com FastAPI, Pika, Tenacity, Circuit Breaker e Docker Compose para facilitar testes e análise de desempenho.
| Funcionalidade | Detalhe |
|---|---|
| Fluent Interface | Encadeamento de operações como .declare_exchange().declare_queue().bind_queue().publish() |
| Criação Dinâmica de Recursos | Declara exchanges/filas na primeira execução |
| Reconnection Automática | Reconecta até 5x com backoff exponencial |
| Thread Safety | Canais isolados por thread com threading.local() |
| Structured Logging | Logs em formato JSON com contexto completo |
| Prometheus Metrics | (Futuro) Métricas de sucesso/falha |
| OpenTelemetry Integration | (Futuro) Rastreamento distribuído |
| Elemento | Detalhe |
|---|---|
| Circuit Breaker | Evita falhas em cascata após falhas persistentes |
| Retry com Backoff Exponencial | Trata falhas transitórias de rede |
| Canais por Thread | Garante thread-safety e isolamento |
| Idempotência | Trata 406 PRECONDITION_FAILED como sucesso |
| Confirm Mode | Garante confirmação de envio (opcional) |
| Log Estruturado | Facilita diagnóstico e monitoramento |
| Validação de Parâmetro | Evita operações inválidas no RabbitMQ |
| Padrão | Detalhe |
|---|---|
| Resiliência | Circuit breaker + retry + recovery |
| Thread Safety | Canais isolados por thread |
| Idempotência | 406 PRECONDITION_FAILED tratado como sucesso |
| Log Enriquecido | Cada log contém contexto relevante |
| Validação de Entrada | Evita operações inválidas |
| Publicação Persistente | delivery_mode=2 para mensagens críticas |
| Tratamento de Erro Específico | Cada tipo de erro é tratado de forma diferente |
| Configuração Centralizada | Todos os parâmetros vêm de settings.py |
| Encapsulamento | Detalhes internos ocultos do cliente |
project-root/
├── api/ # Endpoints FastAPI
│ ├── customer/
│ │ ├── models.py # Modelos Pydantic
│ │ └── routes.py # Endpoint de criação de cliente
│ └── health/
│ └── routes.py # Health check do serviço
├── services/ # Lógica de negócios
│ ├── rabbitmq/
│ │ ├── __rabbitmq_service.py # Conexão e operações básicas
│ │ └── rabbitmq_publisher.py # Interface fluente |
│ └── __init__.py
├── settings.py # Configuração via .env
├── run.py # Entry point do FastAPI
├── docker-compose.yml # RabbitMQ via Docker
├── requirements.txt # Dependências
└── .env # Variáveis de ambiente
- Python 3.10+
- Docker e Docker Compose
- Pika, FastAPI, Uvicorn, Tenacity, CircuitBreaker
pip install -r requirements.txt- Subir o RabbitMQ com Docker Compose:
docker-compose up -d --build- Executar a API:
python run.py- Enviar uma requisição de cliente:
curl -X POST http://localhost:8080/customer \
-H "Content-Type: application/json" \
-d '{"name":"Tiago Tartari","email":"tiago@example.com","uuid":"88c3b2e6-5eab-476b-833d-b839497667b0"}'- Acessar o painel do RabbitMQ:
http://localhost:15672
- Como o RabbitMQ se comporta sob alta carga com declaração dinâmica de recursos
- Qual o impacto de
confirm_mode,declare_exchange,declare_queueem cada requisição - Como garantir resiliência e estabilidade com
tenacityecircuitbreaker
- Declaração de recursos por requisição
- Alta concorrência
- Mensagens grandes ou pequenas
- Ambiente local vs. remoto
APP_HOST=0.0.0.0
APP_PORT=8080
LOG_LEVEL=INFO
LOG_FORMAT=json
RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_USER=user
RABBITMQ_PASSWORD=password
RABBITMQ_HEARTBEAT=600
RABBITMQ_BLOCKED_CONNECTION_TIMEOUT=300
RABBITMQ_PUBLISHER_CONFIRM_MODE=True
AUTO_DECLARE_EXCHANGES=True
AUTO_DECLARE_QUEUES=True-
Worker RabbitMQ (Consumidor)
- Crie um serviço consumidor com interface fluente
-
Monitoramento com Prometheus (Future)
- Adicione métricas por tipo de evento
-
Rastreamento com OpenTelemetry (Future)
- Integre com tracing para correlação de logs
-
Fallback Local (Future)
- Salve mensagens localmente se RabbitMQ estiver offline
-
Health Check Avançado (Future)
- Verifique se exchanges/filas já existem antes do fluxo
{
"timestamp": "2025-04-05T12:34:56.789Z",
"operation_id": "uuid-gerado",
"step": "declare_exchange",
"status": "success",
"exchange": "customer_events",
"queue": null,
"routing_key": null,
"current_success": true
}| Vantagem | Detalhe |
|---|---|
| Interface fluente | Fácil leitura e uso |
| Thread-local channels | Garante segurança |
| Confirm delivery | Garante confiança no envio |
| Retry e Circuit Breaker | Aumentam resiliência |
| Structured Logging | Facilita diagnóstico |
| Auto-declaração | Útil para POCs rápidas |
-
Worker RabbitMQ
- Crie um consumidor com interface fluente
-
Cache de Recursos
- Armazene exchanges/filas já declaradas
-
Middleware de Logs Otimizado
- Use
log_format=textem produção
- Use
-
Validação de Fluxo
- Adicione verificação de pré-requisitos
-
Reaproveitamento de Canais
- Reuse canais entre requisições