Skip to content

Joao-Peterson/rinhabackend2014Q1

Repository files navigation

Rinha de gal... backend

Meu projeto para rinha de backend 2024 Q1 feito em C.

Feito usando facil.io, uma biblioteca C que traz um web server performante + mini http framework. Special thanks to boazsegev for the lib!

Lib do próprio postgres para conexão com a db. Sem caching externo, como Redis por exemplo.

Sumário

Performance

Muito boa aperformance 👍

  • Nginx
    • Workers: 1024 (testado até com 512 sem problemas)
    • epoll
    • Access log off
    • Keepalive
    • Caching
  • Postgresql
    • Docker compose health check
    • Campo de busca (generated nome, apelido, stack) e indexação com trigrama
  • Api
    • Thread pool. Tamanho da pool usada na versão final: [1]
    • Connection pool. Tamanho da pool usada na versão final: [1]
    • Libs
      • libpq: postgresql lib
      • facil.io: webserver, http handling, thread pool, json
  • Docker compose
    • Network mode como host para todos os serviços
  • Recursos:
serviço cpu (cores) memória ram(gb)
api 1 0.1 100 mb
api 2 0.1 100 mb
nginx 0.1 50 mb
postgresql 1.2 300 mb

Funcionamento

Este projeto foi feito em C utilizando postgres como banco de dados.

Web

O elemento web foi feito utilizando a biblioteca facil.io, que já dá algumas funcionalidades básicas para um webserver http como: http parsing, multi threading, multi process/worker behavior, json parsing.

Banco de dados

Para comunicação com o postgres utilizei a biblioteca do postgres mesmo.

Para ajudar na abstração e habilitar a criação de uma connection pool, eu mesmo fiz uma layer de abstração genérica para base dados em C, que engloba diferentes tipos de conexão, veja src/db.c, src/db.h, src/db_priv.h e src/db_postgres.h.

.env

Temos um util varenv.h para carregar arquivos .env e settar as váriavéis de ambiente no Linux:

// try load env var from env file
loadEnvVars(NULL);

Takeaways

  • Containers docker em modo network_mode: host são mais performantes. Ao que tudo indica, a network padrão modo bridge possuí processamente extra sobre ele que afeta o desempenho, enquanto que quando se usa o host não há essa limitação
  • Webservers performantes usam uma thread para cada conexão, utilizando uma thread pool como mecanismo para tal
  • Similarmente, queries para banco de dados usam uma conexão para cada thread, utilizando uma connection pool
  • Base de dados gastam bastante cpu e memória se usadas muitas conexões, gargala demais, usar menos conexões se possível
  • Desativar logging desnecessário
  • Kit preguiçoso:
    • CREATE UNLOGGED TABLE
    • fsync = 0
  • PgTune para 'tunar' a performance do postgres para as restrições de memória

Resultados

Progresso feito através dos testes, documentando alterações, resultados e descobertas se encontra em RESULTADOS.md.

Execução

Dependencies:

  • make
  • gcc
  • docker
  • docker-compose
  • java 8

Local

Compilar projeto em modo release local

$ make release

Copiar o .env.template para .env e colocar sua config.

.env:

SERVER_PORT=5000  	# porta que o servidor vai escutar
SERVER_DB_CONNS=10	# quantidade de conexões simultâneas com o db
SERVER_THREADS=25 	# quantidade de threads a serem usadas para o servidor 
SERVER_WORKERS=5  	# quantidade de processos a serem usado para o servidor
DB_HOST=          	# endereço do db
DB_PORT=          	# porta do db
DB_DATABASE=      	# nome da db
DB_USER=          	# usuário da db
DB_PASSWORD=      	# senha do usuário da db

(Opcional): Subir o banco postgres com docker compose:

$ sudo docker-compose up db -d 

Para usar a db do compose, configurar o .env como:

DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=capi
DB_USER=capi
DB_PASSWORD=rinhadegalo

Executar:

$ ./webserver

Docker compose

Já configurado para rinha com: docker-compose.yml.

Atenção a senha, pois sudo será usado por causa do docker!

$ make up
  • Utiliza port=9999.

Utilização

HTTP Endpoints conforme definido nas intruções da rinha.

Gatling

Para realizar o stress test com o gatling, basta executar:

$ make gatling

Obs:

TODO

  • Usar unix sockets entre nginx e as apis

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages