/rinha-de-backend-2024-q1-cadu

Minha submissão para a Rinha de Backend 2024-Q1 do Zan

Primary LanguageRustCreative Commons Zero v1.0 UniversalCC0-1.0

Rinha de Backend 2024 Q1 - Submissão do @Cadu

Projeto desenvolvido para a Rinha de Backend 2024-Q1.

Foquei em desempenho nesse projeto, com o lema "menos é mais".

Isso significa que houveram tradeoffs e alguns corners cortados, buscando boa performance e latência. (ou seja, nem tudo aqui vai estar tão bonito e arquitetado o quanto poderia ou deveria estar num projeto real)

Como rodar o projeto

docker compose up

Diagrama de Componentes

graph TD
  A[(.)] -->|requisições| B[rinha-ingress:9999]
  B -->|requisições| C[rinha-api1]
  B -->|requisições| D[rinha-api2]
  C -->|consultas| E[(rinha-db)]
  D -->|consultas| E
Loading

Descrição dos componentes / Stack

  • rinha-ingress
    • HAProxy no modo TCP
  • rinha-api-{1,2}
    • rust 1.76
    • Api é com o ntex (fork do actix-web pelo próprio autor do actix)
    • Runtime é o tokiozão das massa.
    • Banco de dados:
      • bb8 (pool de conexões)
      • bb8-postgres (adaptador do bb8 pro postgres)
      • tokio_postgres (driver do postgres)
    • Extras:
      • chrono pra trampar com datas sem ficar maluco.
      • env_logger pra printar uns treco enquanto tava desenvolvendo.
    • Build multistage copiando o binário para um container scratch
      • literalmente, o container só tem o executável.
  • rinha-db
    • postgres:16
      • fsync ligado, nada de unlogged tables, ...
      • Todas as tabelas tem apenas uma letra no nome, e todos os campos também.
        • Quanto menos bytes no fio, melhor ;-) Vamos aumentar o SNR kkkkk
      • Tweaks de performance para commit assíncrono e emagrecimento do WAL, visto que temos um cenário sem replicações.
  • Algumas considerações:
    • nada de alpine foi usado, de propósito, pois existem algumas considerações de performance importantes com a musl-libc que atrapalhariam o foco aqui, comparado com a glibc.

Aleatoriedades

Coisas que me ajudaram pelo caminho.

EOF