Endpoint Node.js Responsivo sob Alta Concorrência
Nota de preparação para a N-iX — performance de backend.
Resumo: use padrões async não-bloqueantes, descarregue tarefas de CPU e escale horizontalmente.
Estratégias-chave
- I/O assíncrono não-bloqueante:
- Use
async/awaitpara todo I/O (DB, APIs externas, sistema de arquivos). - Evite funções
Sync(readFileSync,crypto.pbkdf2Sync). - Use streams para dados grandes (export CSV) e não bufferizar na memória.
- Use
- Tarefas intensivas em CPU:
- Mova-as para Worker Threads ou um microsserviço separado.
- Use
worker_threadsou uma fila externa (Bull + Redis). - Responda imediatamente com
202 Acceptede processe em background.
- Connection Pooling:
- Para PostgreSQL, use
pg.Poolcom um máximo de conexões configurado. - Mantenha o pool abaixo do máximo do banco para evitar timeouts.
- Para PostgreSQL, use
- Rate Limiting & Backpressure:
- Aplique rate limiting (por IP/usuário) — ver ordem dos middlewares.
- Use sinais de backpressure para frear clientes quando sobrecarregado.
- Escala horizontal:
- Rode múltiplas instâncias Node (cluster mode ou PM2).
- Use um load balancer (NGINX) para distribuir as requisições.
- Garanta statelessness para qualquer instância atender qualquer request.
- Monitoramento & Observabilidade:
- Métricas (req/s, taxa de erro, latência) via Prometheus.
- Tracing distribuído (OpenTelemetry) para localizar gargalos.
app.post("/api/report", async (req, res) => {
const { data } = req.body;
const job = await queue.add("generate-report", { data });
res.status(202).json({ jobId: job.id }); // resposta imediata
});
Resultado real (Seguralta)
Usado em relatórios mensais de comissão. O endpoint suportou 2.500 requisições
concorrentes sem bloquear o event loop, com tempo de resposta médio < 200ms para
o 202 Accepted inicial.
Relacionadas: cadeia de middlewares · índice.