Como Otimizar a Infraestrutura de Produção Node.js: Melhores Práticas

Guia de otimização de desempenho Node.js

Prefácio

Na Forward Email, passamos anos aperfeiçoando nossa configuração de ambiente de produção Node.js. Este guia abrangente compartilha nossas melhores práticas testadas em batalha para implantação de produção Node.js, focando na otimização de desempenho, monitoramento e nas lições que aprendemos ao escalar aplicações Node.js para lidar com milhões de transações diárias.

Nossa Revolução de Otimização de Desempenho de Núcleo Único de 573%

Quando migramos de processadores Intel para AMD Ryzen, alcançamos uma melhoria de desempenho de 573% em nossas aplicações Node.js. Isso não foi apenas uma otimização menor — mudou fundamentalmente como nossas aplicações Node.js performam em produção e demonstra a importância da otimização de desempenho de núcleo único para qualquer aplicação Node.js.

Tip

Para melhores práticas de implantação de produção Node.js, a escolha do hardware é crítica. Escolhemos especificamente a hospedagem DataPacket pela disponibilidade de AMD Ryzen porque o desempenho de núcleo único é crucial para aplicações Node.js, já que a execução do JavaScript é single-threaded.

Por que a Otimização de Desempenho de Núcleo Único Importa para Node.js

Nossa migração de Intel para AMD Ryzen resultou em:

  • Melhoria de desempenho de 573% no processamento de requisições (documentado na Issue #1519 do nosso status page no GitHub)
  • Eliminação de atrasos no processamento para respostas quase instantâneas (mencionado na Issue #298 do GitHub)
  • Melhor relação custo-benefício para ambientes de produção Node.js
  • Melhoria nos tempos de resposta em todos os nossos endpoints de aplicação

O aumento de desempenho foi tão significativo que agora consideramos os processadores AMD Ryzen essenciais para qualquer implantação séria de produção Node.js, seja para aplicações web, APIs, microsserviços ou qualquer outra carga de trabalho Node.js.

Para mais detalhes sobre nossas escolhas de infraestrutura, confira:

Configuração do Ambiente de Produção Node.js: Nossa Pilha Tecnológica

Nossas melhores práticas para implantação de produção Node.js incluem escolhas tecnológicas deliberadas baseadas em anos de experiência em produção. Aqui está o que usamos e por que essas escolhas se aplicam a qualquer aplicação Node.js:

Gerenciador de Pacotes: pnpm para Eficiência em Produção

O que usamos: pnpm (versão fixa)

Escolhemos pnpm em vez de npm e yarn para nossa configuração de ambiente de produção Node.js porque:

  • Tempos de instalação mais rápidos em pipelines CI/CD
  • Eficiência no uso de espaço em disco através de hard linking
  • Resolução estrita de dependências que previne dependências fantasmas
  • Melhor desempenho em implantações de produção

Note

Como parte das nossas melhores práticas para implantação de produção Node.js, fixamos versões exatas de ferramentas críticas como o pnpm para garantir comportamento consistente em todos os ambientes e máquinas dos membros da equipe.

Detalhes da implementação:

Framework Web: Koa para Produção Moderna Node.js

O que usamos:

  • @koa/router
  • @koa/multer
  • @ladjs/koa-simple-ratelimit Escolhemos Koa em vez do Express para nossa infraestrutura de produção Node.js por seu suporte moderno a async/await e composição de middleware mais limpa. Nosso fundador Nick Baugh contribuiu para ambos Express e Koa, nos dando uma visão profunda de ambos os frameworks para uso em produção.

Esses padrões se aplicam quer você esteja construindo APIs REST, servidores GraphQL, aplicações web ou microsserviços.

Nossos exemplos de implementação:

Processamento de Jobs em Segundo Plano: Bree para Confiabilidade em Produção

O que usamos: scheduler bree

Criamos e mantemos o Bree porque os agendadores de jobs existentes não atendiam às nossas necessidades de suporte a worker threads e recursos modernos do JavaScript em ambientes Node.js de produção. Isso se aplica a qualquer aplicação Node.js que precise de processamento em segundo plano, tarefas agendadas ou worker threads.

Nossos exemplos de implementação:

Tratamento de Erros: @hapi/boom para Confiabilidade em Produção

O que usamos: @hapi/boom

Usamos @hapi/boom para respostas de erro estruturadas em todas as nossas aplicações Node.js de produção. Esse padrão funciona para qualquer aplicação Node.js que precise de tratamento consistente de erros.

Nossos exemplos de implementação:

Como Monitorar Aplicações Node.js em Produção

Nossa abordagem para monitorar aplicações Node.js em produção evoluiu ao longo de anos rodando aplicações em escala. Implementamos monitoramento em múltiplas camadas para garantir confiabilidade e desempenho para qualquer tipo de aplicação Node.js.

Monitoramento de Produção Node.js em Nível de Sistema

Nossa implementação principal: helpers/monitor-server.js

O que usamos: node-os-utils

Nossos limites de monitoramento em produção (do nosso código real de produção):

  • Limite de heap de 2GB com alertas automáticos
  • 25% de uso de memória limite de aviso
  • 80% de uso de CPU limite de alerta
  • 75% de uso de disco limite de aviso

Warning

Esses limites funcionam para nossa configuração específica de hardware. Ao implementar monitoramento de produção Node.js, revise nossa implementação monitor-server.js para entender a lógica exata e adaptar os valores para sua configuração.

Monitoramento em Nível de Aplicação para Produção Node.js

Nossa classificação de erros: helpers/is-code-bug.js

Esse helper distingue entre:

  • Bugs reais de código que requerem atenção imediata
  • Erros do usuário que são comportamento esperado
  • Falhas de serviços externos que não podemos controlar

Esse padrão se aplica a qualquer aplicação Node.js - apps web, APIs, microsserviços ou serviços em segundo plano. Nossa implementação de logging: helpers/logger.js

Implementamos uma redação abrangente de campos para proteger informações sensíveis enquanto mantemos capacidades úteis de depuração em nosso ambiente de produção Node.js.

Monitoramento Específico da Aplicação

Nossas implementações de servidor:

Monitoramento de fila: Implementamos limites de fila de 5GB e timeouts de 180 segundos para processamento de requisições para evitar exaustão de recursos. Esses padrões se aplicam a qualquer aplicação Node.js com filas ou processamento em segundo plano.

Monitoramento de Produção Node.js com Verificações de Saúde PM2

Aprimoramos nossa configuração de ambiente de produção Node.js com PM2 ao longo de anos de experiência em produção. Nossas verificações de saúde PM2 são essenciais para manter a confiabilidade em qualquer aplicação Node.js.

Nosso Sistema de Verificação de Saúde PM2

Nossa implementação principal: jobs/check-pm2.js

Nosso monitoramento de produção Node.js com verificações de saúde PM2 inclui:

  • Executa a cada 20 minutos via agendamento cron
  • Requer no mínimo 15 minutos de uptime antes de considerar um processo saudável
  • Valida status do processo e uso de memória
  • Reinicia automaticamente processos falhos
  • Previne loops de reinício através de verificação inteligente de saúde

Caution

Para melhores práticas de implantação em produção Node.js, exigimos mais de 15 minutos de uptime antes de considerar um processo saudável para evitar loops de reinício. Isso previne falhas em cascata quando processos estão enfrentando problemas de memória ou outros.

Nossa Configuração de Produção PM2

Nossa configuração do ecossistema: Estude nossos arquivos de inicialização de servidor para configuração do ambiente de produção Node.js:

Esses padrões se aplicam independentemente de você estar executando apps Express, servidores Koa, APIs GraphQL ou qualquer outra aplicação Node.js.

Implantação Automatizada PM2

Implantação PM2: ansible/playbooks/node.yml

Automatizamos toda nossa configuração PM2 através do Ansible para garantir implantações consistentes de produção Node.js em todos os nossos servidores.

Sistema de Tratamento e Classificação de Erros em Produção

Uma das nossas melhores práticas mais valiosas para implantação em produção Node.js é a classificação inteligente de erros que se aplica a qualquer aplicação Node.js:

Nossa Implementação isCodeBug para Produção

Fonte: helpers/is-code-bug.js

Este helper fornece classificação inteligente de erros para aplicações Node.js em produção para:

  • Priorizar bugs reais em vez de erros de usuário
  • Melhorar nossa resposta a incidentes focando em problemas reais
  • Reduzir fadiga de alertas causados por erros esperados de usuários
  • Entender melhor problemas gerados pela aplicação versus pelo usuário

Esse padrão funciona para qualquer aplicação Node.js - seja você construindo sites de e-commerce, plataformas SaaS, APIs ou microsserviços.

Integração com Nosso Logging de Produção

Nossa integração de logger: helpers/logger.js Nosso logger usa isCodeBug para determinar níveis de alerta e redação de campos, garantindo que sejamos notificados sobre problemas reais enquanto filtramos ruídos em nosso ambiente de produção Node.js.

Saiba mais sobre nossos padrões de tratamento de erros:

Depuração Avançada de Performance com v8-profiler-next e cpupro

Usamos ferramentas avançadas de profiling para analisar snapshots de heap e depurar problemas de OOM (Out of Memory), gargalos de performance e problemas de memória do Node.js em nosso ambiente de produção. Essas ferramentas são essenciais para qualquer aplicação Node.js que esteja enfrentando vazamentos de memória ou problemas de desempenho.

Nossa Abordagem de Profiling para Produção Node.js

Ferramentas que recomendamos:

  • v8-profiler-next - Para gerar snapshots de heap e perfis de CPU
  • cpupro - Para analisar perfis de CPU e snapshots de heap

Tip

Usamos v8-profiler-next e cpupro juntos para criar um fluxo completo de depuração de performance para nossas aplicações Node.js. Essa combinação nos ajuda a identificar vazamentos de memória, gargalos de performance e otimizar nosso código de produção.

Como Implementamos a Análise de Heap Snapshot

Nossa implementação de monitoramento: helpers/monitor-server.js

Nosso monitoramento de produção inclui geração automática de snapshots de heap quando os limites de memória são ultrapassados. Isso nos ajuda a depurar problemas de OOM antes que causem falhas na aplicação.

Padrões chave de implementação:

  • Snapshots automáticos quando o tamanho do heap ultrapassa o limite de 2GB
  • Profiling baseado em sinais para análise sob demanda em produção
  • Políticas de retenção para gerenciar o armazenamento dos snapshots
  • Integração com nossos jobs de limpeza para manutenção automatizada

Fluxo de Trabalho de Depuração de Performance

Estude nossa implementação real:

Para análise de heap snapshot:

  1. Instale v8-profiler-next para geração de snapshots
  2. Use cpupro para analisar os snapshots gerados
  3. Implemente limites de monitoramento similar ao nosso monitor-server.js
  4. Configure limpeza automatizada para gerenciar o armazenamento dos snapshots
  5. Crie handlers de sinais para profiling sob demanda em produção

Para profiling de CPU:

  1. Gere perfis de CPU durante períodos de alta carga
  2. Analise com cpupro para identificar gargalos
  3. Foque em caminhos críticos e oportunidades de otimização
  4. Monitore antes/depois das melhorias de performance

Warning

Gerar snapshots de heap e perfis de CPU pode impactar a performance. Recomendamos implementar limitação e habilitar o profiling apenas ao investigar problemas específicos ou durante janelas de manutenção.

Integração com Nosso Monitoramento de Produção

Nossas ferramentas de profiling se integram com nossa estratégia mais ampla de monitoramento:

  • Disparo automático baseado em limites de memória/CPU
  • Integração de alertas quando problemas de performance são detectados
  • Análise histórica para acompanhar tendências de performance ao longo do tempo
  • Correlação com métricas da aplicação para depuração abrangente Esta abordagem nos ajudou a identificar e resolver vazamentos de memória, otimizar caminhos críticos de código e manter desempenho estável em nosso ambiente de produção Node.js.

Segurança da Infraestrutura de Produção Node.js

Implementamos segurança abrangente para nossa infraestrutura de produção Node.js por meio da automação Ansible. Essas práticas se aplicam a qualquer aplicação Node.js:

Segurança em Nível de Sistema para Produção Node.js

Nossa implementação Ansible: ansible/playbooks/security.yml

Nossas principais medidas de segurança para ambientes de produção Node.js:

  • Swap desabilitado para evitar que dados sensíveis sejam gravados no disco
  • Core dumps desabilitados para evitar despejos de memória contendo informações sensíveis
  • Armazenamento USB bloqueado para prevenir acesso não autorizado a dados
  • Ajuste de parâmetros do kernel para segurança e desempenho

Warning

Ao implementar as melhores práticas de implantação para produção Node.js, desabilitar o swap pode causar encerramentos por falta de memória se sua aplicação exceder a RAM disponível. Monitoramos o uso de memória cuidadosamente e dimensionamos nossos servidores adequadamente.

Segurança da Aplicação para Aplicações Node.js

Nossa redação de campos de log: helpers/logger.js

Redigimos campos sensíveis dos logs, incluindo senhas, tokens, chaves de API e informações pessoais. Isso protege a privacidade do usuário enquanto mantém a capacidade de depuração em qualquer ambiente de produção Node.js.

Automação de Segurança da Infraestrutura

Nossa configuração completa Ansible para produção Node.js:

Nosso Conteúdo de Segurança

Saiba mais sobre nossa abordagem de segurança:

Arquitetura de Banco de Dados para Aplicações Node.js

Usamos uma abordagem híbrida de banco de dados otimizada para nossas aplicações Node.js. Esses padrões podem ser adaptados para qualquer aplicação Node.js:

Implementação SQLite para Produção Node.js

O que usamos:

Nossa configuração: ansible/playbooks/sqlite.yml

Usamos SQLite para dados específicos do usuário em nossas aplicações Node.js porque oferece:

  • Isolamento de dados por usuário/locatário
  • Melhor desempenho para consultas de usuário único
  • Backup e migração simplificados
  • Complexidade reduzida comparado a bancos de dados compartilhados

Esse padrão funciona bem para aplicações SaaS, sistemas multi-tenant ou qualquer aplicação Node.js que precise de isolamento de dados.

Implementação MongoDB para Produção Node.js

O que usamos:

Nossa configuração: config/mongoose.js

Usamos MongoDB para dados da aplicação em nosso ambiente de produção Node.js porque ele oferece:

  • Esquema flexível para estruturas de dados em evolução
  • Melhor desempenho para consultas complexas
  • Capacidades de escalonamento horizontal
  • Linguagem de consulta rica

Note

Nossa abordagem híbrida é otimizada para nosso caso de uso específico. Estude nossos padrões reais de uso do banco de dados no código para entender se essa abordagem se encaixa nas necessidades da sua aplicação Node.js.

Processamento de Jobs em Segundo Plano em Produção Node.js

Construímos nossa arquitetura de jobs em segundo plano em torno do Bree para implantação confiável em produção Node.js. Isso se aplica a qualquer aplicação Node.js que precise de processamento em segundo plano:

Nossa Configuração do Servidor Bree para Produção

Nossa implementação principal: bree.js

Nossa implantação Ansible: ansible/playbooks/bree.yml

Exemplos de Jobs em Produção

Monitoramento de saúde: jobs/check-pm2.js

Automação de limpeza: jobs/cleanup-tmp.js

Todos os nossos jobs: Navegue pelo nosso diretório completo de jobs

Esses padrões se aplicam a qualquer aplicação Node.js que precise de:

  • Tarefas agendadas (processamento de dados, relatórios, limpeza)
  • Processamento em segundo plano (redimensionamento de imagens, envio de e-mails, importação de dados)
  • Monitoramento de saúde e manutenção
  • Utilização de threads de trabalho para tarefas intensivas em CPU

Nossos Padrões de Agendamento de Jobs para Produção Node.js

Estude nossos padrões reais de agendamento de jobs em nosso diretório de jobs para entender:

  • Como implementamos agendamento tipo cron em produção Node.js
  • Nossa lógica de tratamento de erros e tentativas
  • Como usamos threads de trabalho para tarefas intensivas em CPU

Manutenção Automatizada para Aplicações Node.js em Produção

Implementamos manutenção proativa para prevenir problemas comuns em produção Node.js. Esses padrões se aplicam a qualquer aplicação Node.js:

Nossa Implementação de Limpeza

Fonte: jobs/cleanup-tmp.js

Nossa manutenção automatizada para aplicações Node.js em produção foca em:

  • Arquivos temporários com mais de 24 horas
  • Arquivos de log além dos limites de retenção
  • Arquivos de cache e dados temporários
  • Arquivos enviados que não são mais necessários
  • Snapshots de heap de depuração de desempenho

Esses padrões se aplicam a qualquer aplicação Node.js que gere arquivos temporários, logs ou dados em cache.

Gerenciamento de Espaço em Disco para Produção Node.js

Nossos limites de monitoramento: helpers/monitor-server.js

  • Limites de fila para processamento em segundo plano
  • Aviso de 75% de uso do disco
  • Limpeza automática quando os limites são ultrapassados

Automação de Manutenção de Infraestrutura

Nossa automação Ansible para produção Node.js:

Guia de Implementação para Implantação em Produção Node.js

Estude Nosso Código Real para Melhores Práticas de Produção

Comece com estes arquivos-chave para configuração do ambiente de produção Node.js:

  1. Configuração: config/index.js
  2. Monitoramento: helpers/monitor-server.js
  3. Tratamento de erros: helpers/is-code-bug.js
  4. Registro de logs: helpers/logger.js
  5. Saúde do processo: jobs/check-pm2.js

Aprenda com Nossos Posts no Blog

Nossos guias técnicos de implementação para produção Node.js:

Automação de Infraestrutura para Produção Node.js

Nossos playbooks Ansible para estudar sobre implantação de produção Node.js:

Nossos Estudos de Caso

Nossas implementações empresariais:

Conclusão: Melhores Práticas para Implantação de Produção Node.js

Nossa infraestrutura de produção Node.js demonstra que aplicações Node.js podem alcançar confiabilidade de nível empresarial através de:

  • Escolhas comprovadas de hardware (AMD Ryzen para otimização de desempenho single core em 573%)
  • Monitoramento de produção Node.js testado em campo com limites específicos e respostas automatizadas
  • Classificação inteligente de erros para melhorar a resposta a incidentes em ambientes de produção
  • Depuração avançada de desempenho com v8-profiler-next e cpupro para prevenção de OOM
  • Endurecimento abrangente de segurança através de automação Ansible
  • Arquitetura híbrida de banco de dados otimizada para necessidades da aplicação
  • Manutenção automatizada para prevenir problemas comuns em produção Node.js

Principal lição: Estude nossos arquivos de implementação reais e posts no blog em vez de seguir práticas genéricas. Nossa base de código fornece padrões do mundo real para implantação de produção Node.js que podem ser adaptados para qualquer aplicação Node.js - apps web, APIs, microsserviços ou serviços em background.

Lista Completa de Recursos para Produção Node.js

Nossos Arquivos Principais de Implementação

Nossas Implementações de Servidor

Nossa Automação de Infraestrutura

Nossos Posts Técnicos no Blog

Nossos Estudos de Caso Empresariais