E aí, devs! Bora pra mais um experimento hardcore?
Hoje vamos colocar reativo (WebFlux + R2DBC) e JDBC clássico (Spring MVC) pra brigar na arena de 10.000 requisições.
Sem teoria chata — teste real, benchmark, print bonitão e verdade nua e crua sobre quem aguenta pressão.
🎯 O que vamos fazer?
Testar o mesmo endpoint, com a mesma carga, no mesmo Postgres — apenas trocando a stack:
- Reativo: Spring WebFlux + R2DBC
https://github.com/Maddytec/bora_praticar_spring_boot_jpa_h2_rest/tree/reative - JDBC: Spring MVC + JDBC
https://github.com/Maddytec/bora_praticar_spring_boot_jpa_h2_rest/tree/postgresql
E comparar:
🔥 Métricas que importam de verdade:
- Throughput: requisições por segundo (quem entrega mais?)
- Latência: p50, p95, p99 (quem derrapa quando aperta?)
- Estabilidade: erros, timeouts, variância
- Threads: reativo trabalha com meia dúzia, JDBC abre um carnaval
🧠 Como funciona o lado reativo (resumão do código)
Repositório Reativo
public interface ClienteRepository extends ReactiveCrudRepository<Cliente, Long> {}
Serviço (tudo non-blocking)
public Mono<Cliente> salvar(Cliente cliente) {
return clienteRepository.save(cliente);
}
Controller (Flux/Mono na veia)
@PostMapping
public Mono<ResponseEntity<Cliente>> salvar(@RequestBody Mono<Cliente> cliente){
return cliente
.switchIfEmpty(Mono.error(...))
.flatMap(clienteService::salvar)
.map(saved -> ResponseEntity.status(HttpStatus.CREATED).body(saved));
}
É isso.
Nada de threads presas, nada de esperar o banco, nada de pool estourado.
🛠 Setup para rodar a guerra
✔ Pré-requisitos
- Java 21
- Maven
- Docker
- Ferramenta de carga (k6, wrk, autocannon, hey — escolha uma)
✔ Subir Postgres
docker-compose -f docker/postgresql-docker-compose.yaml up -d
Banco fica em:localhost:5433 / db/user/pass: cliente
✔ Rodar cada API
Reativo
git checkout reative mvn -DskipTests spring-boot:run
JDBC
git checkout postgresql mvn -DskipTests spring-boot:run
Ambas sobem em:
http://localhost:8080/api/v1/cliente
📬 O endpoint usado no teste
POST /api/v1/cliente
Body:
{
"nome": "Maddytec 1",
"email": "maddytec1@test.com",
"cpf": "1"
}
🚀 Mandando 10.000 requisições com 1.000 simultâneas
Escolha sua arma:
⚡ k6 (Windows/Linux/mac)
Crie k6-post.js:
import http from 'k6/http';
export const options = { vus: 1000, iterations: 10000 };
export default function () {
const url = 'http://localhost:8080/api/v1/cliente';
const body = JSON.stringify({ nome: 'Maddytec 1', email: 'maddytec1@test.com', cpf: '1' });
const headers = { 'Content-Type': 'application/json' };
http.post(url, body, { headers });
}
Rode:
k6 run k6-post.js
⚡ wrk (Linux/mac)
post.lua:
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"nome":"Maddytec 1","email":"maddytec1@test.com","cpf":"1"}'
Rode:
wrk -t4 -c1000 -d30s -s post.lua http://localhost:8080/api/v1/cliente
⚡ autocannon (Node)
autocannon -c 1000 -d 30 -m POST \
-H 'Content-Type: application/json' \
-b '{"nome":"Maddytec 1","email":"maddytec1@test.com","cpf":"1"}' \
http://localhost:8080/api/v1/cliente
⚡ hey (mac)
hey -m POST -H 'Content-Type: application/json' \
-d '{"nome":"Maddytec 1","email":"maddytec1@test.com","cpf":"1"}' \
-c 1000 -n 10000 http://localhost:8080/api/v1/cliente
🧼 Dica ninja antes de cada teste
Limpe a tabela pro resultado não virar bagunça:
docker exec -i cliente-postgres psql -U cliente -d cliente -c "DELETE FROM cliente;"
📊 Como interpretar o caos
📈 Throughput alto →
Stack está servindo mais gente rápido.
🧪 Latências (p50/p95/p99) →
Se p95/p99 subirem muito, alguém tá sofrendo pressão.
💥 Erros →
Se aparecer 500/503/timeout, já sabe: gargalo detectado.
🧵 Threads →
- Reativo: poucas threads relaxadas fazendo mágica
- JDBC: um exército de threads lutando pela sobrevivência
🏁 Resumo da brincadeira
Reativo (WebFlux + R2DBC)
✔ Non-blocking total
✔ Brilha em alta concorrência
✔ Usa pouquíssimas threads
✔ Ideal pra microservices modernos
✔ Perfeito quando banco/IO são o gargalo
JDBC (MVC + JDBC)
✔ Simples, conhecido, estável
✔ Ótimo para CRUD normal
❌ Bloqueante
❌ Sofre com 1000+ requisições simultâneas
❌ Pools e threads saturam fácil
😎 Conclusão do BoraPraticar
Reativo não deixa seu código mais rápido.
Ele deixa seu servidor atender MUITO mais gente com o mesmo hardware.
Rode, compare, imprime o caos, posta print no LinkedIn, marca a galera e bora praticar 💙