Essa implementação usa o seguinte stack:
- Quarkus 3
- OpenJDK 17
- PostgreSQL (latest)
- Nginx (latest)
O foco dessa implementação é o método K.I.S.S.
Por exemplo, não tem cache (e.g., Redis), e o número de conexões com o banco está configurado para 20, por instância de API (40 total). Outro ajuste importante foi o heap da JVM para 80%
. Fora isso, o banco (PostgreSQL) e o load balancer (Nginx) tem algums ajustes:
- max_connections=200
Número máximo de conexões. Com certeza não precisamos mais do que 200. Mais informações.
- shared_buffers=256MB
Aumenta o tamanho do buffer em memória para evitar escrita em disco. O padrão é 128MB. Mais informações.
- synchronous_commit=off
Executa inserts mais rápido, retornando a conexão imediatamente para o pool. Com este parâmetro, atingimos "consistência eventual" no sistema. Mais informações.
- fsync=off
Diminui o número de chamadas para o disco já que não precisamos garantir o estado do banco em caso de crash. Mais informações.
- full_page_writes=off
Desabilita escritas do estado do banco após completar diversas atividades do banco. Por ser um benchmark, também não precisamos disso. Mais informações.
- least_conn
Este modo de load balancer é similar ao round-robin, mas manda o requeste para a instância com menos conexões ativas. Mais informações.
Use Docker Compose de acordo com o seu sistema operacional.
Para hardware x64, basta executar o comando abaixo:
docker compose up
Se for um hardware Apple M1 ou Linux Arm, execute o comando abaixo:
docker compose -f docker-compose-arm.yml up
Utilize os arquivos docker-compose-local.yml
(x64) ou docker-compose-local-arm.yml
(M1/Arm):
x64:
docker compose -f docker-compose-local.yml up
M1/Arm:
docker compose -f docker-compose-local-arm.yml up
Inicie o banco de dados:
x64:
docker compose up -d db-postgresql
M1/Arm
docker compose -f docker-compose-arm.yml -d db-postgresql
Inicie a aplicação Quarkus:
./mvnw quarkus:dev
Accesse por http://localhost:8080/contagem-pessoas.
O código está no GitHub, no repositório brunoborges/rinha-app.
Bruno Borges (@brunoborges).
Qualquer dúvida, pergunta no Twitter.
MIT