Este projeto é uma implementação da Rinha de Backend 2024/Q1 utilizando Java 21 com Virtual Threads (Project Loom).
- Java 21: Utilizando recursos recentes como Virtual Threads (Project Loom)
- HTTP Server: Servidor HTTP nativo do Java (com.sun.net.httpserver)
- HikariCP: Pool de conexões de alto desempenho
- PostgreSQL: Banco de dados relacional
- Docker e Docker Compose: Para containerização
- Nginx: Como load balancer
A solução segue a arquitetura especificada pela Rinha de Backend:
+------------------+
| |
| Nginx |
| Load Balancer |
| (porta 9999) |
| |
+------------------+
/ \
/ \
/ \
+-----------+ +------------+
| | | |
| API 01 | | API 02 |
| | | |
+-----------+ +------------+
\ /
\ /
\ /
+---------------+
| |
| PostgreSQL |
| |
+---------------+
O projeto utiliza Virtual Threads (Project Loom) do Java 21, que permite:
- Criação de milhares de threads virtuais com baixo overhead
- Melhor utilização dos recursos do sistema
- Um thread por requisição sem bloquear threads do sistema operacional
// Configuração do servidor para usar Virtual Threads
server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
O PostgreSQL foi configurado com parâmetros para otimizar o desempenho em alta concorrência:
command: postgres -c checkpoint_timeout=600 -c max_connections=200 -c shared_buffers=256MB
-c synchronous_commit=off -c fsync=off -c work_mem=12MB -c maintenance_work_mem=128MB
-c random_page_cost=1.1 -c effective_cache_size=300MB -c max_parallel_workers_per_gather=4
-c max_parallel_workers=8 -c max_worker_processes=8
Além disso, utilizamos HikariCP para gerenciamento eficiente de conexões com o banco:
// Configurações otimizadas para o pool de conexões
config.setMaximumPoolSize(20);
config.setMinimumIdle(10);
config.setConnectionTimeout(30000);
config.addDataSourceProperty("cachePrepStmts", "true");
O Nginx foi configurado para otimizar o balanceamento de carga e o gerenciamento de conexões:
worker_connections 2048
: Aumenta o número de conexões simultâneaskeepalive 500
: Mantém conexões persistentes com os servidores APIproxy_buffer_size
eproxy_buffers
: Otimização de bufferstcp_nopush
,tcp_nodelay
: Otimizações TCP
- Docker e Docker Compose
- Java 21 (apenas para desenvolvimento local)
-
Clone o repositório:
git clone https://github.com/bulletdev/rinha-backend-bullet.git cd rinha-backend-bullet
-
Construa as imagens:
docker-compose build
-
Execute com Docker Compose:
docker-compose up -d
-
A API estará disponível na porta 9999:
curl -X GET http://localhost:9999/clientes/1/extrato
No Windows (prompt de comando):
curl -X POST http://localhost:9999/clientes/1/transacoes -H "Content-Type: application/json" -d "{\"valor\": 1000, \"tipo\": \"c\", \"descricao\": \"salario\"}"
No Linux/Mac:
curl -X POST http://localhost:9999/clientes/1/transacoes -H "Content-Type: application/json" -d '{"valor": 1000, "tipo": "c", "descricao": "salario"}'
curl -X GET http://localhost:9999/clientes/1/extrato
O projeto inclui um script k6 para testes de carga:
# Se tiver o k6 instalado:
k6 run k6/script.js
O projeto segue uma arquitetura limpa e modular:
/src
/main
/java/br/com/rinha
/config # Configurações (banco de dados, etc.)
/handler # Manipuladores de requisições HTTP
/model # Entidades do domínio
/repository # Acesso a dados
/util # Utilitários
O projeto respeita as limitações de CPU e memória impostas pela Rinha de Backend:
- Total CPU: 1.5 unidades (distribuídas entre os serviços)
- Total Memória: 550MB (distribuída entre os serviços)
Se você encontrar o erro "Connection refused" entre os contêineres, verifique:
- Se os nomes dos serviços no docker-compose.yml correspondem aos utilizados na configuração
- Se todos os contêineres estão na mesma rede Docker
- Se o mapeamento de portas está correto (lembre-se que 9999:9999 é diferente de 9999:80)
- Contato@michaelbullet.com
- http://github.com/bulletdev
- http://michaelbullet.com
⢀⣴⣿⣿⣿⣿⣿⣶⣶⣶⣿⣿⣶⣶⣶⣶⣶⣿⡿⣿⣾⣷⣶⣶⣾⣿⠀ ⣠⣿⣿⢿⣿⣯⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⡇⣿⣿⣿⣿⣿⡇ ⠀⣰⣿⣿⣷⡟⠤⠟⠁⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇ ⠀⣿⣿⣿⣿⣿⣷⣶⣿⣿⡟⠁⣮⡻⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇ ⠘⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⣿⣿⣹⣿⣿⣿⣿⣿⣿⡿⢸⡇⣿⣿⣿⣿⣿⡇ ⠀⠙⢿⣿⣿⣿⡿⠟⠁⣿⣿⣶⣿⠟⢻⣿⣿⣿⣿⣿⣿⡇⣼⡇⣿⣿⣿⣿⣿⠇ ⠀⠀⠈⠋⠉⠁⣶⣶⣶⣿⣿⣿⣿⢀⣿⣿⣿⣿⣿⣿⣿⣇⣿⢰⣿⣿⣿⣿⣿⠀ ⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣽⣿⣼⣿⣿⣿⣿⠇⠀ ⠀⠀⠀⠀⠀⠀⠀⠈⠉⠒⠚⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠛⠿⠿⠿⠿⠿⠋⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⣿⣙⡆⠀⠀⡇⠀⢸⠀⠀⢸⠀⠀ ⢸⡇⠀⠀⢸⣏⡉ ⠙⡏⠁⠀ ⠀⠀⠀⣿⣉⡷⠀⠀⢧⣀⣼ ⠀⢸⣀ ⢸⣇⡀ ⢸⣏⣁⠀ ⠀⡇⠀