Melhores Práticas do Event Loop
Regras para manter o event loop do Node.js responsivo sob carga - descarregue CPU, agrupe I/O e meça o lag antes que os usuários o sintam.
Busque em todas as páginas da documentação
Regras para manter o event loop do Node.js responsivo sob carga - descarregue CPU, agrupe I/O e meça o lag antes que os usuários o sintam.
worker_threads ou uma fila.*Sync (readFileSync, bcrypt.hashSync) em manipuladores HTTP. Use variantes assíncronas de promise ou callback.JSON.parse na borda e na aplicação. Corpos grandes bloqueiam a análise de forma síncrona.Promise.all para I/O independente, não await sequencial em loops. Adicione limites de concorrência para lotes grandes.queueMicrotask ou setImmediate em vez de setTimeout(fn, 0) para adiamento. Combine o tipo de adiamento com as necessidades de ordenação.process.nextTick para agrupar trabalho. Isso deixa I/O e timers sem atendimento.try/catch em código aguardado em manipuladores de requisição. Rejeições não tratadas derrubam o processo.for await em streams em vez de carregar payloads inteiros na memória. Streams cooperam com backpressure.setTimeout/setInterval como aproximados, não relógios em tempo real. Use agendadores externos para cron de relógio de parede.setInterval sobrepostos. Encadeie setTimeout após a conclusão do trabalho.SIGTERM). Ou chame .unref() apenas quando for intencionalmente fire-and-forget.monitorEventLoopDelay. Alerte antes que o p99 voltado para o usuário dobre.eventLoopUtilization ao lado da CPU. ELU alta com CPU moderada sinaliza blocos síncronos.blocked-at em staging para atribuir blocos a stack traces. Não ativado o tempo todo em produção.Nenhum JavaScript síncrono longo na thread principal durante o tratamento de requisições. Todo o resto segue disso.
Não. async apenas cede em pontos de await. Código síncrono entre awaits ainda bloqueia.
Depende do hardware - profile. Regra geral: limite corpos a 1-10 MB para APIs típicas; stream além disso.
cluster duplica listeners HTTP entre núcleos. worker_threads compartilha um servidor com pools de CPU. Frequentemente use ambos os padrões em camadas diferentes.
Não - guards, pipes e interceptors ainda rodam na thread principal, a menos que você descarregue explicitamente.
Somente se eles descarregarem para o thread pool do libuv ou retornarem async. Chamadas nativas síncronas bloqueiam como loops JavaScript.
zlib.gzipSync bloqueia - use promisify(gzip) ou zlib/promises em caminhos de requisição.
Melhorado, mas o tratamento explícito de erros e a higiene do loop continuam sendo sua responsabilidade.
Procure por Sync, loops apertados, JSON.parse(req.body) e novo middleware sem benchmarks.
A compilação do JSON Schema geralmente ocorre na inicialização; a validação por requisição é síncrona, mas rápida - ainda profile payloads grandes.
Adiar o trabalho até depois da fase de poll de I/O atual - agrupar múltiplas leituras de socket antes da agregação.
Detectando Bloqueio do Event-Loop para métricas e worker_threads para correções.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026