Neste desafio, você deverá implementar e orquestrar a infraestrutura para uma aplicação de e-commerce simulada com requisitos de alta disponibilidade, escalabilidade e resiliência. Seu objetivo é criar uma solução que atenda aos requisitos funcionais e não-funcionais listados abaixo.
- Prazo: Até a meia-noite do dia 30/06/2025 (2025-06-30T23:59:59-03:00)
- Apresentação dos Resultados: Live em 05/07/2025 no canal Rinha de DevOps
- Ferramentas de Teste: Gatling para testes de carga, Chaos Toolkit para testes de resiliência
- Limite de Recursos: 1.5 CPUs e 3GB de RAM para distribuir como achar melhor
- Obrigatório: Docker-compose, código de infraestrutura (IaC), monitoramento e automação de CI/CD
Você está encarregado de implementar a infraestrutura para uma aplicação de e-commerce que possui os seguintes componentes:
- API de Catálogo: Serviço responsável pelo catálogo de produtos
- API de Pedidos: Serviço responsável pelo gerenciamento de pedidos
- API de Pagamentos: Serviço responsável pelo processamento de pagamentos
- Banco de Dados: Armazenamento persistente para os dados das aplicações
- Cache: Sistema de cache para melhorar a performance
-
Alta Disponibilidade:
- As APIs devem estar sempre disponíveis, mesmo durante deploys ou falhas
- Tempo máximo de recuperação após falha: 30 segundos
-
Escalabilidade:
- As APIs devem escalar automaticamente sob carga
- Tempo de resposta deve permanecer abaixo de 500ms sob carga
-
Observabilidade:
- Implementar dashboard com métricas de performance
- Coleta de logs centralizada
- Rastreamento distribuído de requisições
- Alertas configurados para falhas e degradação de performance
-
CI/CD:
- Pipeline automatizado para deploy
- Rollback automático em caso de falha
- Zero downtime durante deploys
-
Segurança:
- Implementar TLS para todas as comunicações
- Secrets management para credenciais
- Network policies restritivas
O teste terá os seguintes componentes e topologia:
Stress Test (Gatling) → Load Balancer → APIs (múltiplas instâncias) → Serviços de Dados
↑ ↑
| |
Monitoring Chaos Tests
O load balancer distribuirá as requisições entre as instâncias das APIs.
Cada API deverá ter pelo menos 2 instâncias rodando simultaneamente.
Você pode escolher entre PostgreSQL, MySQL ou MongoDB. A solução deve garantir persistência dos dados mesmo em caso de reinicialização dos containers.
Deve implementar uma stack de monitoramento com Prometheus + Grafana, ou solução equivalente.
version: '3.8'
services:
# API Catálogo
api-catalogo-1:
image: rinhadevops/api-catalogo:latest
hostname: api-catalogo-1
depends_on:
- db
- cache
expose:
- "8080"
deploy:
resources:
limits:
cpus: '0.5'
memory: '500MB'
environment:
# Variáveis de ambiente necessárias
api-catalogo-2:
# Similar ao api-catalogo-1
# API Pedidos
api-pedidos-1:
image: rinhadevops/api-pedidos:latest
# Configuração similar
api-pedidos-2:
# Configuração similar
# API Pagamentos
api-pagamentos-1:
image: rinhadevops/api-pagamentos:latest
# Configuração similar
api-pagamentos-2:
# Configuração similar
# Load Balancer
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- api-catalogo-1
- api-catalogo-2
- api-pedidos-1
- api-pedidos-2
- api-pagamentos-1
- api-pagamentos-2
ports:
- "4444:4444"
deploy:
resources:
limits:
cpus: '0.5'
memory: '500MB'
# Banco de Dados
db:
image: postgres:latest # ou mysql, ou mongo
volumes:
- db-data:/var/lib/postgresql/data
deploy:
resources:
limits:
cpus: '1.0'
memory: '2GB'
# Cache
cache:
image: redis:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: '1GB'
# Monitoramento
prometheus:
image: prom/prometheus:latest
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro
ports:
- "9090:9090"
deploy:
resources:
limits:
cpus: '0.5'
memory: '1GB'
grafana:
image: grafana/grafana:latest
volumes:
- ./monitoring/dashboards:/var/lib/grafana/dashboards
- ./monitoring/datasources:/etc/grafana/provisioning/datasources
ports:
- "3000:3000"
depends_on:
- prometheus
deploy:
resources:
limits:
cpus: '0.5'
memory: '1GB'
volumes:
db-data:O teste de carga será executado usando Gatling com cenários que simularão:
- Navegação de catálogo: Requisições a produtos populares e busca
- Criação de pedidos: Fluxo completo de checkout
- Carga constante: Base constante de 100 usuários virtuais
- Pico de carga: Rampas que sobem até 500 usuários virtuais
Usando Chaos Toolkit, executaremos testes que:
- Matam containers aleatoriamente
- Introduzem latência de rede
- Consomem recursos da máquina (CPU/Memória)
- Simulam falhas de conexão com o banco de dados
Sua solução será avaliada com base nos seguintes critérios:
-
Performance:
- Throughput mantido durante o teste de carga
- Tempo de resposta médio e P95
- Uso eficiente dos recursos (CPU/Memória)
-
Resiliência:
- Tempo médio de recuperação após falha (MTTR)
- Percentual de erros durante testes de Chaos
- Capacidade de manter o serviço disponível
-
Observabilidade:
- Qualidade das métricas e dashboards
- Alertas configurados corretamente
- Facilidade de diagnóstico de problemas
-
Infraestrutura como Código:
- Qualidade e legibilidade do código
- Modularidade e reusabilidade
- Gerenciamento adequado de segredos e configurações
-
CI/CD:
- Automação do pipeline
- Estratégia de deploy (Canary, Blue/Green, etc.)
- Testes automatizados na pipeline
Você precisa fazer o seguinte para participar:
-
Criar um repositório Git público com:
- Código da infraestrutura (IaC)
- Docker-compose.yml
- Configurações de monitoramento
- Pipeline de CI/CD
- Documentação
-
Enviar um Pull Request para este repositório criando um sub-diretório em
/participantes/seu-timecom:- Um README.md com link para seu repositório Git
- Um docker-compose.yml com suas configurações
- Qualquer outro arquivo necessário para execução da solução
Abaixo está um diagrama de arquitetura de referência que você pode seguir, mas sinta-se livre para adaptar conforme sua proposta:
┌─────────────────┐ ┌───────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ Load Balancer │ ──▶ │ API Gateway │────▶│ Service Mesh │
│ (Nginx) │ │ (Kong/Traefik) │ (opcional) │
│ │ │ │ │ │
└─────────────────┘ └───────────────┘ └─────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ │ │ │ │ │ │
│ │ Catálogo │ ◀───▶│ Pedidos │◀───▶ │ Pagamentos │ │
│ │ Service │ │ Service │ │ Service │ │
│ │ │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Catálogo │ │ Pedidos │ │ Pagamentos │ │
│ │ Database │ │ Database │ │ Database │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────-───┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────-────┐ │
│ │ │ │ │ │ │ │
│ │ Prometheus │◀───▶ │ Grafana │◀───▶ │ Alert Manager │ │
│ │ │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └──────────────-───┘ │
│ │
└──────────────────────────────────────────────────────────────────┘
Boa sorte e que vença a melhor infraestrutura!