Sistema de votação em alta escala projetado para suportar cenários como o "paredão BBB", capaz de processar milhares de votos por segundo.
- Frontend: React nextjs
- Backend: Node.js com Express (JavaScript vanilla)
- Redis: Cache e contagem em tempo real
- PostgreSQL: Persistência de dados
- SQS: Processamento assíncrono de votos (via LocalStack em ambiente de desenvolvimento)
- Docker & Docker Compose: Ambiente de desenvolvimento local
- Terraform: Infraestrutura como código para ambientes AWS
- Docker e Docker Compose
- Make (opcional, mas recomendado para facilitar o uso)
/voting-system/ ├── frontend/ # Aplicação React │ ├── public/ │ ├── src/ │ │ ├── components/ # Componentes como Header, Footer │ │ ├── pages/ # Páginas da aplicação │ │ └── utils/ # API services │ ├── package.json │ └── Dockerfile │ ├── backend/ # API Node.js/Express em JavaScript vanilla │ ├── src/ │ │ ├── controllers/ # Lógica de negócio │ │ ├── routes/ # Rotas da API │ │ ├── models/ # Modelos do Sequelize │ │ ├── services/ # Serviços (Redis, SQS) │ │ └── server.js # Ponto de entrada │ ├── package.json │ └── Dockerfile │ ├── worker/ # Worker para processar votos │ ├── src/ │ │ └── index.js # Processador de votos │ ├── package.json │ └── Dockerfile │ ├── scripts/ # Scripts utilitários │ └── init-localstack.sh # Inicialização do SQS │ ├── configure/ # Ferramentas de configuração │ └── Makefile # Comandos Make para facilitar o desenvolvimento │ ├── terraform/ # Infraestrutura como código │ ├── main.tf # Configuração principal do Terraform │ ├── variables.tf # Variáveis do Terraform │ ├── modules/ # Módulos Terraform (rede, banco de dados, etc.) │ └── environments/ # Configurações específicas de ambiente │ ├── dev/ # Ambiente de desenvolvimento │ ├── staging/ # Ambiente de staging │ └── prod/ # Ambiente de produção │ └── docker-compose.yml # Orquestração dos containers -
Clone o repositório:
git clone https://github.com/seu-usuario/voting-system.git cd voting-system -
Inicie o ambiente usando Make:
cd configure make setup # Cria arquivos .env se necessário make start # Inicia todos os containers em modo detached
Alternativamente, sem Make:
docker-compose up -d
-
Acompanhe os logs:
make logs
-
Acesse as aplicações:
- Frontend: http://localhost:3000
- Backend API: http://localhost:4000
-
Para encerrar:
make stop
No diretório configure/, você pode usar os seguintes comandos:
make help- Mostra lista de comandos disponíveismake setup- Configura o ambiente inicialmake start- Inicia todos os containersmake stop- Para todos os containersmake logs- Exibe logs de todos os containersmake restart- Reinicia os containersmake rebuild- Reconstrói e reinicia containers (após alterações)make clean- Remove containers, volumes e redes
Para testes rápidos:
make create-test-poll- Cria uma votação de teste via APImake vote poll_id=XXX part_id=YYY- Envia um voto de testemake status poll_id=XXX- Verifica resultados de uma votação
Cada serviço (frontend, backend, worker) é um container separado que pode ser desenvolvido e testado de forma independente.
O backend expõe uma API REST e gerencia:
- Validação de votos
- Rate limiting via Redis
- Contagem em tempo real no Redis
- Envio de mensagens para o SQS
O frontend é uma aplicação React que:
- Exibe votações ativas
- Permite votar em participantes
- Mostra resultados em tempo real
- Oferece área de administração
O worker:
- Consome mensagens da fila SQS
- Grava os votos no PostgreSQL
- Processa em lotes para maior eficiência
Para testar o fluxo completo:
-
Crie uma votação:
make create-test-poll # Anote o ID da votação retornado no JSON -
Envie um voto:
make vote poll_id=ID-DA-VOTACAO part_id=ID-DO-PARTICIPANTE
-
Verifique o resultado:
make status poll_id=ID-DA-VOTACAO
-
O frontend também mostrará os resultados em tempo real.
O sistema segue uma arquitetura desacoplada:
- Frontend → Backend: Envia requisições de voto para a API
- Backend:
- Valida os dados
- Incrementa contadores no Redis
- Envia mensagem para SQS
- Responde imediatamente ao usuário
- Worker:
- Consome mensagens do SQS
- Persiste no PostgreSQL
- Frontend: Consulta resultados periodicamente
Esta arquitetura permite:
- Resposta rápida ao usuário (Redis)
- Alta escalabilidade (processamento assíncrono via SQS)
- Resiliência (mensagens persistidas na fila em caso de falha)
- Dados históricos e análises (PostgreSQL)
Para um ambiente de produção:
-
Infraestrutura:
- Use o Terraform para provisionar a infraestrutura na AWS
-
Segurança:
- Configure HTTPS em todas as comunicações
-
Observabilidade:
- Utilize o CloudWatch para monitoramento e alertas
- Configure dashboards para métricas importantes
- Configure alarmes para métricas críticas
O projeto inclui configuração Terraform para implantação na AWS:
- Suporte para múltiplos ambientes (dev, staging, prod)
- Módulos Terraform reutilizáveis
- Infraestrutura completa:
- Rede (VPC, subnets, NAT Gateway)
- Compute (ECS Fargate)
- Banco de dados (RDS PostgreSQL)
- Cache (ElastiCache Redis)
- Mensageria (SQS)
- CDN (CloudFront)
- Monitoramento (CloudWatch)
MIT