Skip to content

dugabriel/mongodb-database-test

Repository files navigation

MongoDB Database Per Tenant

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.

🏗️ Arquitetura

  • 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

🚀 Como Executar

Pré-requisitos

  • Docker e Docker Compose
  • Node.js 18+ (para desenvolvimento local)
  • K6 (para testes de carga)

1. Configuração das Empresas

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')}`;
}

2. Executar com Docker Compose

# 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

3. Verificar se está funcionando

# 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

4. Executar Testes de Carga

# 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

📊 Monitoramento

HAProxy Stats

Acesse: http://localhost:8404/stats

Health Checks

  • Aplicação: GET /health
  • Pool de conexões: GET /pool-info

Logs

# 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

🔧 Configurações

Variáveis de Ambiente

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

Pool de Conexões MongoDB

{
    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
}

📁 Estrutura do Projeto

├── 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

🎯 Endpoints da API

GET /health

Verifica o status da aplicação e conexão MongoDB.

GET /pool-info

Retorna informações sobre o pool de conexões.

POST /create-message-with-steps/:database

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
}

🧪 Testes de Carga

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

🛠️ Desenvolvimento Local

# Instalar dependências
npm install

# Executar localmente
npm start

# A aplicação estará disponível em http://localhost:3000

🔍 Troubleshooting

Problemas Comuns

  1. Erro de limite de databases

    • MongoDB Community tem limite de 100 databases
    • Use MongoDB Enterprise ou reduza TOTAL_COMPANIES
  2. Conexões esgotadas

    • Ajuste maxPoolSize no arquivo mongodb.js
    • Monitore via endpoint /pool-info
  3. Load balancer não funciona

Logs Úteis

# 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

📈 Performance

  • 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

🔒 Segurança

  • Usuário não-root nos containers
  • Autenticação MongoDB habilitada
  • Health checks para monitoramento
  • Timeouts configurados para evitar conexões órfãs

About

App using nodejs to stress many databases in a mongodb

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published