Sistema de arquitetura multi-tenant com MongoDB, onde cada empresa possui seu próprio banco de dados. O projeto implementa um pool de conexões otimizado, load balancer com HAProxy e testes de carga com K6.
- 3 instâncias da aplicação rodando em containers Docker
- HAProxy como load balancer na porta 80
- MongoDB 8.0 com autenticação
- Pool de conexões otimizado (min: 5, max: 50 conexões)
- Testes de carga com K6 para validação de performance
- Docker e Docker Compose
- Node.js 18+ (para desenvolvimento local)
- K6 (para testes de carga)
No docker-compose.yml:
environment:
- TOTAL_COMPANIES=3000 # Altere este valor conforme necessário
No teste de carga (tests/load-test.js):
function getRandomCompany() {
const totalCompanies = 3000; // Altere para o mesmo valor do docker-compose
const companyNumber = Math.floor(Math.random() * totalCompanies) + 1;
return `company${companyNumber.toString().padStart(2, '0')}`;
}
# Clonar o repositório
git clone <repository-url>
cd mongo-database-per-tenant
# Iniciar todos os serviços
docker-compose up -d
# Verificar status dos containers
docker-compose ps
# Ver logs da aplicação
docker-compose logs -f app1
# Health check
curl http://localhost/health
# Informações do pool de conexões
curl http://localhost/pool-info
# Criar uma mensagem de teste
curl -X POST http://localhost/create-message-with-steps/company01
# Instalar K6 (Ubuntu/Debian)
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
# Executar teste de carga
k6 run tests/load-test.js
# Executar com URL customizada
k6 run -e BASE_URL=http://localhost:80 tests/load-test.js
Acesse: http://localhost:8404/stats
- Aplicação:
GET /health
- Pool de conexões:
GET /pool-info
# Logs de todas as aplicações
docker-compose logs -f
# Logs específicos
docker-compose logs -f app1
docker-compose logs -f mongodb
docker-compose logs -f haproxy
Variável | Descrição | Padrão |
---|---|---|
TOTAL_COMPANIES |
Número total de empresas/tenants | 3000 |
MONGODB_URI |
URI de conexão MongoDB | mongodb://admin:password123@mongodb:27017/tenant_db?authSource=admin |
PORT |
Porta da aplicação | 3000 |
NODE_ENV |
Ambiente de execução | production |
{
maxPoolSize: 50, // Máximo de conexões
minPoolSize: 5, // Mínimo de conexões
maxConnecting: 55, // Máximo conectando simultaneamente
maxIdleTimeMS: 30000, // Tempo limite para conexões idle
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
connectTimeoutMS: 10000
}
├── src/
│ ├── data/ # Dados de teste (headers e payloads)
│ ├── index.js # Servidor principal
│ ├── routes.js # Rotas da API
│ ├── mongodb.js # Configuração e pool de conexões
│ └── mongoconfigtest.js # Configuração de empresas e schema
├── tests/
│ ├── load-test.js # Teste de carga K6
│ └── reports/ # Relatórios de teste
├── docker-compose.yml # Orquestração dos serviços
├── Dockerfile # Imagem da aplicação
├── haproxy.cfg # Configuração do load balancer
└── mongo-init.js # Script de inicialização do MongoDB
Verifica o status da aplicação e conexão MongoDB.
Retorna informações sobre o pool de conexões.
Cria uma mensagem e seus steps em um database específico.
Parâmetros:
database
: Nome do database (ex: company01, company02, etc.)
Resposta:
{
"success": true,
"message": "Message e Message Steps criados com sucesso",
"database": "company01",
"messageId": "abc123def456",
"numberOfSteps": 8
}
O teste K6 simula:
- Rampa de subida: 0 → 50 usuários (30s)
- Pico: 50 → 150 usuários (2m)
- Sustentação: 150 usuários (3m)
- Rampa de descida: 150 → 0 usuários (1.5m)
Thresholds configurados:
- 95% das requisições < 2s
- Taxa de erro < 10%
- Taxa de sucesso > 90%
Relatórios gerados:
tests/reports/load-test-report.html
tests/reports/load-test-summary.txt
# Instalar dependências
npm install
# Executar localmente
npm start
# A aplicação estará disponível em http://localhost:3000
-
Erro de limite de databases
- MongoDB Community tem limite de 100 databases
- Use MongoDB Enterprise ou reduza
TOTAL_COMPANIES
-
Conexões esgotadas
- Ajuste
maxPoolSize
no arquivomongodb.js
- Monitore via endpoint
/pool-info
- Ajuste
-
Load balancer não funciona
- Verifique se todos os containers estão rodando
- Acesse http://localhost:8404/stats para monitorar
# Verificar conexões MongoDB
docker-compose logs mongodb | grep "connection"
# Verificar health checks
docker-compose logs app1 | grep "health"
# Verificar HAProxy
docker-compose logs haproxy
- Pool de conexões otimizado para alta concorrência
- Load balancing com HAProxy
- Health checks automáticos
- Graceful shutdown para evitar perda de dados
- Índices otimizados nas coleções principais
- Usuário não-root nos containers
- Autenticação MongoDB habilitada
- Health checks para monitoramento
- Timeouts configurados para evitar conexões órfãs