https://github.com/bulletdev/rinha-backend-bullet
Projeto para a rinha de Backend 2024 Q1
https://github.com/bulletdev/rinha-backend-bullet
docker gatling java loom virtualthreads
Last synced: 7 months ago
JSON representation
Projeto para a rinha de Backend 2024 Q1
- Host: GitHub
- URL: https://github.com/bulletdev/rinha-backend-bullet
- Owner: Bulletdev
- Created: 2025-03-25T11:49:15.000Z (7 months ago)
- Default Branch: master
- Last Pushed: 2025-03-25T11:53:06.000Z (7 months ago)
- Last Synced: 2025-03-25T12:38:25.904Z (7 months ago)
- Topics: docker, gatling, java, loom, virtualthreads
- Language: Java
- Homepage:
- Size: 0 Bytes
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Rinha de Backend Bullet - Java com Virtual Threads (Project Loom)
Este projeto é uma implementação da Rinha de Backend 2024/Q1 utilizando Java 21 com Virtual Threads (Project Loom).
## Tecnologias Utilizadas
- **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## Arquitetura
A solução segue a arquitetura especificada pela Rinha de Backend:
```
+------------------+
| |
| Nginx |
| Load Balancer |
| (porta 9999) |
| |
+------------------+
/ \
/ \
/ \
+-----------+ +------------+
| | | |
| API 01 | | API 02 |
| | | |
+-----------+ +------------+
\ /
\ /
\ /
+---------------+
| |
| PostgreSQL |
| |
+---------------+
```## Detalhes da Implementação
### Virtual Threads (Project Loom)
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
```java
server.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
```### Otimizações do Banco de Dados
O PostgreSQL foi configurado com parâmetros para otimizar o desempenho em alta concorrência:
```yaml
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");
```### Configurações do Nginx
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âneas
- `keepalive 500`: Mantém conexões persistentes com os servidores API
- `proxy_buffer_size` e `proxy_buffers`: Otimização de buffers
- `tcp_nopush`, `tcp_nodelay`: Otimizações TCP## Como Executar
### Requisitos
- Docker e Docker Compose
- Java 21 (apenas para desenvolvimento local)### Passos para Execução
1. Clone o repositório:
```bash
git clone https://github.com/bulletdev/rinha-backend-bullet.git
cd rinha-backend-bullet
```2. Construa as imagens:
```bash
docker-compose build
```4. Execute com Docker Compose:
```bash
docker-compose up -d
```5. A API estará disponível na porta 9999:
```bash
curl -X GET http://localhost:9999/clientes/1/extrato
```## Endpoints da API
### 1. Criar Transação
No Windows (prompt de comando):
```bash
curl -X POST http://localhost:9999/clientes/1/transacoes -H "Content-Type: application/json" -d "{\"valor\": 1000, \"tipo\": \"c\", \"descricao\": \"salario\"}"
```No Linux/Mac:
```bashcurl -X POST http://localhost:9999/clientes/1/transacoes -H "Content-Type: application/json" -d '{"valor": 1000, "tipo": "c", "descricao": "salario"}'
```
### 2. Consultar Extrato```bash
curl -X GET http://localhost:9999/clientes/1/extrato
```## Testes de Carga
O projeto inclui um script k6 para testes de carga:
# Se tiver o k6 instalado:
```bash
# Se tiver o k6 instalado:
k6 run k6/script.js
```## Estrutura do Projeto
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
```## Limitações de Recursos
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)## Troubleshooting
Se você encontrar o erro "Connection refused" entre os contêineres, verifique:
1. Se os nomes dos serviços no docker-compose.yml correspondem aos utilizados na configuração
2. Se todos os contêineres estão na mesma rede Docker
3. Se o mapeamento de portas está correto (lembre-se que 9999:9999 é diferente de 9999:80)## Autor
- Contato@michaelbullet.com
- http://github.com/bulletdev
- http://michaelbullet.com
```
⢀⣴⣿⣿⣿⣿⣿⣶⣶⣶⣿⣿⣶⣶⣶⣶⣶⣿⡿⣿⣾⣷⣶⣶⣾⣿⠀
⣠⣿⣿⢿⣿⣯⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣿⡇⣿⣿⣿⣿⣿⡇
⠀⣰⣿⣿⣷⡟⠤⠟⠁⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇
⠀⣿⣿⣿⣿⣿⣷⣶⣿⣿⡟⠁⣮⡻⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⣿⣿⣿⣿⣿⡇
⠘⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⣿⣿⣹⣿⣿⣿⣿⣿⣿⡿⢸⡇⣿⣿⣿⣿⣿⡇
⠀⠙⢿⣿⣿⣿⡿⠟⠁⣿⣿⣶⣿⠟⢻⣿⣿⣿⣿⣿⣿⡇⣼⡇⣿⣿⣿⣿⣿⠇
⠀⠀⠈⠋⠉⠁⣶⣶⣶⣿⣿⣿⣿⢀⣿⣿⣿⣿⣿⣿⣿⣇⣿⢰⣿⣿⣿⣿⣿⠀
⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣽⣿⣼⣿⣿⣿⣿⠇⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠉⠒⠚⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠛⠿⠿⠿⠿⠿⠋⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣿⣙⡆⠀⠀⡇⠀⢸⠀⠀⢸⠀⠀ ⢸⡇⠀⠀⢸⣏⡉ ⠙⡏⠁⠀
⠀⠀⠀⣿⣉⡷⠀⠀⢧⣀⣼ ⠀⢸⣀ ⢸⣇⡀ ⢸⣏⣁⠀ ⠀⡇⠀