Giter Site home page Giter Site logo

vitorsalgado / rinha-2024-q1 Goto Github PK

View Code? Open in Web Editor NEW
0.0 2.0 0.0 133 KB

Rinha de Backend 2024 Q1

Home Page: https://vitorsalgado.github.io/rinha-2024-q1/

License: MIT License

Makefile 10.16% Go 58.81% Dockerfile 1.83% Shell 15.80% PLpgSQL 13.40%
docker go postgresql rinha rinha-de-backend rinha-de-backend-2024-q1

rinha-2024-q1's Introduction

Rinha de Backend 2024 Q1 · ci · GitHub go.mod Go version · GitHub License

Proposta de implementação da Rinha de Backend 2024 Q1.
Os resultados dos testes são publicados automaticamente neste site.

Tech

  • Go
  • Postgres
  • Envoy
  • PgBouncer

Sobre

A idéia era criar um projeto bem simples, com o mínimo possível de libs e frameworks e que também fosse fácil de replicar em outras linguagens.
Em relação a performance, aqui algumas idéias que guiaram o projeto, mais ou menos em uma ordem de prioridade:

  • menos round trips possíveis ao banco de dados. para isso, usei uma function no Postgres para as transações e uma query única para o obter o extrato bancário.

  • gestão eficiente de conexões com o banco. esse ponto é um complemente do anterior, conexões com o banco de dados são "caras" e aqui demorei para achar o setup ideal. desde o início a solução contava com um pool de conexões e no começo esse pool girou em torno de ~100 - ~300 de máx. conexões. depois de vários experimentos, encontrei uma ferramente interessante para o pool de conexões, PgBouncer. com o PgBouncer integrado, o setup ideal acabou sendo: pool=5 nas apis e pool=20 no PgBouncer, um número muito menor do que os experimentos inicias sem esse componente.

  • experimentei usar o nginx como load balancer inicialmente, mas após alguns experimentos com envoy, acabei optando pelo último.

  • threads: dadas as limitações do ambiente em relação a CPU e memória, experimentei diferentes setups de threads para as aplicações. no final, os testes se sairam melhor configurando tudo com o mínimo de processos possível. as apis definem GOMAXPROCS=1. no final, usei a lib automaxprocs para a definição adequada e automática da variável GOMAXPROCS para evitar surpresas no ambiente de testes da rinha. o envoy também foi configurado dessa forma. no comando de start, é passado o parâmetro --concurrency=1.

  • com a solução final pronta, utilizei um recurso chamado PGO (Performance Guided Optimization) para gerar binários mais eficientes das aplicações em Go. basicamente rodei um profiling das apis e do load balancer também, gerando no final um arquivo default.pgo. esse arquivo é então submetido ao build posteriormente.

Executando

Para executar o projeto completo em um docker compose local, execute no seu terminal:

make up

Testes de Carga

Para executar os testes de carga contidos no repositório original da rinha, primeiro execute o comando de preparação:

make prepare

O comando make prepare clona o repositório da rinha e instala a ferramente Gatling.
Ele deve ser executado apenas uma vez.
Para rodar os testes, execute o comando:

make test

rinha-2024-q1's People

Contributors

vitorsalgado avatar dependabot[bot] avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.