Desempenho
Desempenho é um recurso. Projete para o P99, não para a média. Meça antes de otimizar — a intuição está quase sempre errada sobre onde o tempo está sendo gasto.
Regras
- Perfile antes de otimizar. Adivinhar o caminho crítico desperdiça dias. Use gráficos de chama, rastreamento APM ou
EXPLAIN ANALYZEprimeiro. - Elimine consultas N+1. A maior causa de latência em código de serviço. Prefira junções (joins), buscas em lote ou
IN (...)em vez de consultas por linha. - Paginação em todo endpoint de lista. Conjuntos de resultados ilimitados eventualmente causam falta de memória (OOM) em um pod ou saturam o banco de dados. Prefira paginação baseada em cursor para tabelas grandes.
- Indexe apenas predicados de consulta, não todas as colunas. Cada índice extra reduz a velocidade de escrita e aumenta o armazenamento. Adicione um índice somente quando uma consulta conhecida precisar dele.
- Projete apenas as colunas necessárias.
SELECT *em um DTO grande desperdiça rede, memória e GC. Retorne projeções estreitas para APIs de lista. - Armazene em cache dados de leitura intensiva e idempotentes. Mas decida a estratégia de invalidação antes de adicionar o cache — um cache sem plano de remoção é uma fábrica de bugs.
- Defina explicitamente os tamanhos dos pools de conexão e threads. Os padrões raramente são adequados para sua carga de trabalho. Dimensione-os com base na capacidade downstream, não para cima.
- Agrupe chamadas de saída. Uma requisição com 100 itens supera 100 requisições com um item em todos os aspectos — latência, CPU, conexões com o banco.
- Evite cadeias síncronas de chamadas remotas. A latência se acumula. Distribua as operações em paralelo ou mova o trabalho para execução assíncrona.
- Mantenha os payloads pequenos. Comprima as respostas, remova campos não utilizados, use protocolos binários quando for importante (gRPC, Protobuf).
Sinais de alerta
- Loops que consultam o banco de dados.
- APIs que retornam "todos os registros".
- Caches sem TTL e sem invalidação.
- Pool de threads / pool de conexões configurado com o padrão do framework em produção.
- Dashboards de latência que mostram apenas médias (sem P95/P99).