Noções Básicas de Operações em Tempo de Execução
10 exemplos para operar processos Node.js 24 de longa duração em produção - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para operar processos Node.js 24 de longa duração em produção - 7 básicos e 3 intermediários.
mkdir prod-api && cd prod-api
npm init -y
npm pkg set type=module
npm install express@5 pg
npm install -D typescript@5.6 @types/nodePara padrões de desligamento e implantação, consulte Desligamento Gracioso e Implantações Sem Interrupção.
Kubernetes / ECS / systemd / PM2
-> inicia `node dist/main.js`
-> reinicia em caso de falha com código de saída != 0
-> envia SIGTERM na implantação ou redução de escala
-> lê logs stdout
console.log(JSON.stringify({
event: "boot",
node: process.version,
env: process.env.NODE_ENV,
pid: process.pid,
}));app.get("/health", (_req, res) => res.json({ status: "ok" }));
app.get("/ready", async (_req, res) => {
const ok = await pool.query("SELECT 1");
res.status(ok ? 200 : 503).json({ status: ok ? "ready" : "not_ready" });
});uncaughtExceptionprocess.on("uncaughtException", (err) => {
console.error(JSON.stringify({ event: "uncaughtException", message: err.message, stack: err.stack }));
// Política A: sair e deixar o supervisor reiniciar (recomendado para APIs)
process.exit(1);
});uncaughtException; sair é mais seguro para APIs HTTPunhandledRejectionprocess.on("unhandledRejection", (reason) => {
console.error(JSON.stringify({ event: "unhandledRejection", reason: String(reason) }));
process.exit(1);
});app.get("/metrics/memory", (_req, res) => {
const m = process.memoryUsage();
res.json({
rss: m.rss,
heapUsed: m.heapUsed,
heapTotal: m.heapTotal,
external: m.external,
});
});nodejs_heap_size_bytes do Prometheus para monitoramento realNODE_OPTIONSNODE_OPTIONS="--max-old-space-size=384"const server = app.listen(port, "0.0.0.0");
function shutdown(signal: string) {
console.log(JSON.stringify({ event: "shutdown", signal }));
server.close(async () => {
await pool.end();
process.exit(0);
});
setTimeout(() => process.exit(1), 30_000).unref();
}
process.on("SIGTERM", () => shutdown("SIGTERM"));
process.on("SIGINT", () => shutdown("SIGINT"));// ecosystem.config.cjs
module.exports = {
apps: [{
name: "api",
script: "dist/main.js",
instances: 2,
exec_mode: "cluster",
max_memory_restart: "512M",
kill_timeout: 30_000,
listen_timeout: 10_000,
}],
};pm2 start ecosystem.config.cjs
pm2 save| Sintoma | Verificação |
|---|---|
| CPU Alta | Implantação recente? Pico de tráfego? Loop infinito nos logs? |
| Memória Alta | Vazamento de heap? max-old-space-size vs limite? |
| 502 do LB | Pods prontos? Drenagem SIGTERM? Timeout do upstream? |
Veja Iniciadores de Runbook de Plantão.
kubelet + controlador de Deployment. Seu aplicativo manipula SIGTERM; o K8s reinicia contêineres com falha.
Não. Aumente as réplicas de pods em vez do módulo cluster do Node dentro de um único contêiner.
Abaixo de terminationGracePeriodSeconds (geralmente 30-45s). Corresponda ao atraso de desregistro do LB + fechamento do pool de banco de dados.
Apenas stdout. Agentes enviam logs para fora do nó.
Node 24 LTS, correspondendo ao CI e à imagem base do Docker.
A implantação de plataforma é onde/como você executa contêineres. As operações em tempo de execução são como o processo Node se comporta uma vez em execução.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), 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