Cómo optimizar la infraestructura de producción de Node.js: mejores prácticas

Prólogo

En Forward Email, hemos dedicado años a perfeccionar la configuración de nuestro entorno de producción de Node.js. Esta guía completa comparte nuestras prácticas recomendadas para la implementación de Node.js en producción, con una eficacia comprobada, centrándose en la optimización del rendimiento, la monitorización y las lecciones aprendidas al escalar aplicaciones de Node.js para gestionar millones de transacciones diarias.

Nuestra revolución de optimización del rendimiento de un solo núcleo del 573%

Al migrar de procesadores Intel a AMD Ryzen, logramos una mejora del rendimiento del 573 % en nuestras aplicaciones Node.js. Esto no fue solo una optimización menor, sino que cambió radicalmente el rendimiento de nuestras aplicaciones Node.js en producción y demuestra la importancia de la optimización del rendimiento de un solo núcleo para cualquier aplicación Node.js.

Tip

Para las mejores prácticas de implementación de producción de Node.js, la elección del hardware es crucial. Elegimos específicamente el alojamiento de DataPacket por su disponibilidad en AMD Ryzen, ya que el rendimiento de un solo núcleo es crucial para las aplicaciones Node.js, ya que la ejecución de JavaScript es de un solo subproceso.

Por qué es importante la optimización del rendimiento de un solo núcleo para Node.js

Nuestra migración de Intel a AMD Ryzen resultó en:

La mejora del rendimiento fue tan significativa que ahora consideramos los procesadores AMD Ryzen esenciales para cualquier implementación de producción de Node.js, ya sea que ejecute aplicaciones web, API, microservicios o cualquier otra carga de trabajo de Node.js.

Para obtener más información sobre nuestras opciones de infraestructura, consulte:

Configuración del entorno de producción de Node.js: nuestra pila de tecnología

Nuestras mejores prácticas para la implementación de Node.js en producción incluyen la selección de tecnologías deliberadas, basadas en años de experiencia en producción. A continuación, explicamos qué usamos y por qué estas decisiones se aplican a cualquier aplicación Node.js:

Administrador de paquetes: pnpm para eficiencia de producción

Lo que usamos: pnpm (versión fijada)

Elegimos pnpm en lugar de npm y yarn para la configuración de nuestro entorno de producción Node.js porque:

  • Tiempos de instalación más rápidos en pipelines de CI/CD
  • Eficiencia del espacio en disco mediante enlaces físicos
  • Resolución estricta de dependencias que evita dependencias fantasma
  • Mejor rendimiento en implementaciones de producción

Note

Como parte de nuestras mejores prácticas de implementación de producción de Node.js, fijamos versiones exactas de herramientas críticas como pnpm para garantizar un comportamiento consistente en todos los entornos y las máquinas de los miembros del equipo.

Detalles de implementación:

Marco web: Koa para la producción moderna de Node.js

Lo que usamos:

Elegimos Koa en lugar de Express para nuestra infraestructura de producción de Node.js por su moderna compatibilidad con async/await y su estructura de middleware más limpia. Nuestro fundador, Nick Baugh, contribuyó tanto a Express como a Koa, brindándonos un conocimiento profundo de ambos frameworks para su uso en producción.

Estos patrones se aplican independientemente de si estás creando API REST, servidores GraphQL, aplicaciones web o microservicios.

Nuestros ejemplos de implementación:

Procesamiento de trabajos en segundo plano: Bree para confiabilidad de producción

Lo que usamos: Programador bree

Creamos y mantenemos Bree porque los programadores de tareas existentes no satisfacían nuestras necesidades de compatibilidad con subprocesos de trabajo y funciones modernas de JavaScript en entornos de producción de Node.js. Esto aplica a cualquier aplicación de Node.js que requiera procesamiento en segundo plano, tareas programadas o subprocesos de trabajo.

Nuestros ejemplos de implementación:

Manejo de errores: @hapi/boom para confiabilidad de producción

Lo que usamos: @hapi/boom

Usamos @hapi/boom para respuestas de error estructuradas en nuestras aplicaciones de producción de Node.js. Este patrón funciona para cualquier aplicación de Node.js que requiera una gestión de errores consistente.

Nuestros ejemplos de implementación:

Cómo monitorear aplicaciones Node.js en producción

Nuestro enfoque para la monitorización de aplicaciones Node.js en producción ha evolucionado a lo largo de años de ejecución a gran escala. Implementamos la monitorización en múltiples capas para garantizar la fiabilidad y el rendimiento de cualquier tipo de aplicación Node.js.

Monitoreo de producción de Node.js a nivel de sistema

Nuestra implementación principal: helpers/monitor-server.js

Lo que usamos: node-os-utils

Nuestros umbrales de monitorización de la producción (según nuestro código de producción real):

  • Límite de tamaño de pila de 2 GB con alertas automáticas
  • Umbral de advertencia de uso de memoria del 25 %
  • Umbral de advertencia de uso de CPU del 80 %
  • Umbral de advertencia de uso de disco del 75 %

Warning

Estos umbrales funcionan para nuestra configuración de hardware específica. Al implementar la monitorización de producción de Node.js, revise la implementación de monitor-server.js para comprender la lógica exacta y adaptar los valores a su configuración.

Monitoreo a nivel de aplicación para la producción de Node.js

Nuestra clasificación de error: helpers/is-code-bug.js

Este ayudante distingue entre:

  • Errores de código reales que requieren atención inmediata
  • Errores de usuario que son comportamiento esperado
  • Errores de servicios externos que escapan a nuestro control

Este patrón se aplica a cualquier aplicación Node.js: aplicaciones web, API, microservicios o servicios en segundo plano.

Nuestra implementación de registro: helpers/logger.js

Implementamos una redacción de campos integral para proteger la información confidencial y al mismo tiempo mantener capacidades de depuración útiles en nuestro entorno de producción Node.js.

Monitoreo específico de la aplicación

Nuestras implementaciones de servidor:

Monitoreo de colas: Implementamos límites de cola de 5 GB y tiempos de espera de 180 segundos para el procesamiento de solicitudes para evitar el agotamiento de recursos. Estos patrones se aplican a cualquier aplicación Node.js con colas o procesamiento en segundo plano.

Monitoreo de producción de Node.js con comprobaciones de estado de PM2

Hemos perfeccionado la configuración de nuestro entorno de producción de Node.js con PM2 a lo largo de años de experiencia en producción. Nuestras comprobaciones de estado de PM2 son esenciales para mantener la fiabilidad de cualquier aplicación Node.js.

Nuestro sistema de control de salud PM2

Nuestra implementación principal: jobs/check-pm2.js

Nuestra monitorización de producción de Node.js con comprobaciones de estado de PM2 incluye:

  • Se ejecuta cada 20 minutos mediante programación cron
  • Requiere un mínimo de 15 minutos de actividad para considerar que un proceso funciona correctamente
  • Valida el estado del proceso y el uso de memoria
  • Reinicia automáticamente los procesos fallidos
  • Evita bucles de reinicio mediante la comprobación inteligente del estado

Caution

Para las mejores prácticas de implementación de producción de Node.js, requerimos un tiempo de actividad superior a 15 minutos antes de considerar que un proceso está en buen estado para evitar bucles de reinicio. Esto evita fallos en cascada cuando los procesos tienen problemas de memoria u otros problemas.

Nuestra configuración de producción de PM2

Configuración de nuestro ecosistema: Estudie nuestros archivos de inicio del servidor para la configuración del entorno de producción de Node.js:

Estos patrones se aplican independientemente de si está ejecutando aplicaciones Express, servidores Koa, API GraphQL o cualquier otra aplicación Node.js.

Implementación automatizada de PM2

Implementación de PM2: ansible/playbooks/node.yml

Automatizamos toda nuestra configuración de PM2 a través de Ansible para garantizar implementaciones de producción de Node.js consistentes en todos nuestros servidores.

Sistema de clasificación y manejo de errores de producción

Una de nuestras prácticas recomendadas de implementación de producción de Node.js más valiosas es la clasificación inteligente de errores que se aplica a cualquier aplicación Node.js:

Nuestra implementación de isCodeBug para producción

Fuente: helpers/is-code-bug.js

Este ayudante proporciona una clasificación de errores inteligente para aplicaciones Node.js en producción para:

  • Priorizar los errores reales sobre los errores del usuario
  • Mejorar nuestra respuesta a incidentes centrándonos en los problemas reales
  • Reducir la fatiga de alertas causada por errores esperados del usuario
  • Comprender mejor los problemas de la aplicación frente a los generados por el usuario

Este patrón funciona para cualquier aplicación Node.js, ya sea que esté creando sitios de comercio electrónico, plataformas SaaS, API o microservicios.

Integración con nuestro registro de producción

Nuestra integración del registrador: helpers/logger.js

Nuestro registrador utiliza isCodeBug para determinar los niveles de alerta y la redacción de campos, lo que garantiza que recibamos notificaciones sobre problemas reales mientras filtramos el ruido en nuestro entorno de producción Node.js.

Obtenga más información sobre nuestros patrones de manejo de errores:

Depuración de rendimiento avanzada con v8-profiler-next y cpupro

Utilizamos herramientas avanzadas de perfilado para analizar instantáneas del montón y depurar problemas de memoria insuficiente (OOM), cuellos de botella de rendimiento y problemas de memoria de Node.js en nuestro entorno de producción. Estas herramientas son esenciales para cualquier aplicación Node.js que experimente fugas de memoria o problemas de rendimiento.

Nuestro enfoque de creación de perfiles para la producción de Node.js

Herramientas que recomendamos:

  • v8-profiler-next - Para generar instantáneas de montón y perfiles de CPU
  • cpupro - Para analizar perfiles de CPU e instantáneas de montón

Tip

Utilizamos v8-profiler-next y cpupro para crear un flujo de trabajo completo de depuración de rendimiento para nuestras aplicaciones Node.js. Esta combinación nos ayuda a identificar fugas de memoria y cuellos de botella de rendimiento, y a optimizar nuestro código de producción.

Cómo implementamos el análisis de instantáneas de montón

Nuestra implementación de monitoreo: helpers/monitor-server.js

Nuestra monitorización de producción incluye la generación automática de instantáneas del montón cuando se superan los umbrales de memoria. Esto nos ayuda a depurar problemas de memoria insuficiente (OOM) antes de que provoquen fallos en las aplicaciones.

Patrones de implementación clave:

  • Instantáneas automáticas cuando el tamaño del montón supera el límite de 2 GB
  • Perfiles basados en señales para análisis bajo demanda en producción
  • Políticas de retención para la gestión del almacenamiento de instantáneas
  • Integración con nuestras tareas de limpieza para un mantenimiento automatizado

Flujo de trabajo de depuración de rendimiento

Estudie nuestra implementación real:

Para el análisis de instantáneas del montón:

  1. Instalar v8-profiler-next para generar instantáneas
  2. Usar cpupro para analizar las instantáneas generadas
  3. Implementar umbrales de monitorización similares a nuestro monitor-server.js
  4. Configurar la limpieza automatizada para gestionar el almacenamiento de instantáneas
  5. Crear controladores de señales para la generación de perfiles bajo demanda en producción

Para la creación de perfiles de CPU:

  1. Generar perfiles de CPU durante periodos de alta carga
  2. Analizar con cpupro para identificar cuellos de botella
  3. Enfocarse en rutas de alto rendimiento y oportunidades de optimización
  4. Monitorear antes y después de las mejoras de rendimiento

Warning

La generación de instantáneas del montón y perfiles de CPU puede afectar el rendimiento. Recomendamos implementar la limitación y habilitar la generación de perfiles solo al investigar problemas específicos o durante periodos de mantenimiento.

Integración con nuestro monitoreo de producción

Nuestras herramientas de elaboración de perfiles se integran con nuestra estrategia de monitoreo más amplia:

  • Activación automática según los umbrales de memoria/CPU
  • Integración de alertas al detectar problemas de rendimiento
  • Análisis histórico para rastrear las tendencias de rendimiento a lo largo del tiempo
  • Correlación con las métricas de la aplicación para una depuración completa

Este enfoque nos ha ayudado a identificar y resolver fugas de memoria, optimizar rutas de código activo y mantener un rendimiento estable en nuestro entorno de producción Node.js.

Seguridad de la infraestructura de producción de Node.js

Implementamos una seguridad integral para nuestra infraestructura de producción de Node.js mediante la automatización de Ansible. Estas prácticas se aplican a cualquier aplicación de Node.js:

Seguridad a nivel de sistema para la producción de Node.js

Nuestra implementación de Ansible: ansible/playbooks/security.yml

Nuestras medidas de seguridad clave para entornos de producción de Node.js:

  • Intercambio deshabilitado para evitar que se escriban datos confidenciales en el disco
  • Volcados de memoria deshabilitados para evitar volcados de memoria que contengan información confidencial
  • Almacenamiento USB bloqueado para evitar acceso no autorizado a datos
  • Ajuste de parámetros del kernel para seguridad y rendimiento

Warning

Al implementar las mejores prácticas de implementación en producción de Node.js, deshabilitar el intercambio puede causar interrupciones por falta de memoria si la aplicación excede la RAM disponible. Monitoreamos cuidadosamente el uso de memoria y dimensionamos nuestros servidores adecuadamente.

Seguridad de aplicaciones para aplicaciones Node.js

Redacción de nuestro campo de registro: helpers/logger.js

Reducimos los campos sensibles de los registros, como contraseñas, tokens, claves API e información personal. Esto protege la privacidad del usuario y mantiene la capacidad de depuración en cualquier entorno de producción de Node.js.

Automatización de seguridad de infraestructura

Nuestra configuración completa de Ansible para la producción de Node.js:

Nuestro contenido de seguridad

Obtenga más información sobre nuestro enfoque de seguridad:

Arquitectura de base de datos para aplicaciones Node.js

Utilizamos un enfoque de base de datos híbrida optimizado para nuestras aplicaciones Node.js. Estos patrones se pueden adaptar a cualquier aplicación Node.js:

Implementación de SQLite para la producción de Node.js

Lo que usamos:

Nuestra configuración: ansible/playbooks/sqlite.yml

Usamos SQLite para datos específicos del usuario en nuestras aplicaciones Node.js porque proporciona:

  • Aislamiento de datos por usuario/inquilino
  • Mejor rendimiento para consultas de un solo usuario
  • Copia de seguridad y migración simplificadas
  • Menor complejidad en comparación con bases de datos compartidas

Este patrón funciona bien para aplicaciones SaaS, sistemas multiinquilino o cualquier aplicación Node.js que necesite aislamiento de datos.

Implementación de MongoDB para la producción de Node.js

Lo que usamos:

Nuestra implementación de configuración: helpers/setup-mongoose.js

Nuestra configuración: config/mongoose.js

Usamos MongoDB para los datos de la aplicación en nuestro entorno de producción Node.js porque proporciona:

  • Esquema flexible para estructuras de datos en evolución
  • Mejor rendimiento para consultas complejas
  • Capacidades de escalamiento horizontal
  • Lenguaje de consulta enriquecido

Note

Nuestro enfoque híbrido se optimiza para nuestro caso de uso específico. Analice los patrones de uso de la base de datos en el código fuente para comprender si este enfoque se adapta a las necesidades de su aplicación Node.js.

Procesamiento de trabajo en segundo plano de producción de Node.js

Desarrollamos nuestra arquitectura de trabajos en segundo plano en torno a Bree para una implementación de producción confiable de Node.js. Esto aplica a cualquier aplicación Node.js que requiera procesamiento en segundo plano:

Nuestra configuración del servidor Bree para producción

Nuestra implementación principal: bree.js

Nuestra implementación de Ansible: ansible/playbooks/bree.yml

Ejemplos de trabajos de producción

Monitoreo de salud: jobs/check-pm2.js

Automatización de limpieza: jobs/cleanup-tmp.js

Todos nuestros trabajos: Explora nuestro directorio completo de empleos

Estos patrones se aplican a cualquier aplicación Node.js que necesite:

  • Tareas programadas (procesamiento de datos, informes, limpieza)
  • Procesamiento en segundo plano (redimensionamiento de imágenes, envío de correos electrónicos, importación de datos)
  • Monitoreo y mantenimiento del estado
  • Utilización de subprocesos de trabajo para tareas con uso intensivo de CPU

Nuestros patrones de programación de trabajos para la producción de Node.js

Estudie nuestros patrones reales de programación de trabajos en nuestro directorio de trabajos para comprender:

  • Cómo implementamos la programación similar a la de cron en la producción de Node.js
  • Nuestra gestión de errores y lógica de reintentos
  • Cómo usamos los subprocesos de trabajo para tareas que consumen mucha CPU

Mantenimiento automatizado para aplicaciones de producción Node.js

Implementamos mantenimiento proactivo para prevenir problemas comunes en producción de Node.js. Estos patrones se aplican a cualquier aplicación Node.js:

Nuestra implementación de limpieza

Fuente: jobs/cleanup-tmp.js

Nuestro mantenimiento automatizado para aplicaciones de producción Node.js tiene como objetivo:

  • Archivos temporales con más de 24 horas de antigüedad
  • Archivos de registro que superan los límites de retención
  • Archivos de caché y datos temporales
  • Archivos subidos que ya no se necesitan
  • Instantáneas de montón de la depuración de rendimiento

Estos patrones se aplican a cualquier aplicación Node.js que genere archivos temporales, registros o datos almacenados en caché.

Gestión del espacio en disco para la producción de Node.js

Nuestros umbrales de monitoreo: helpers/monitor-server.js

  • Límites de cola para procesamiento en segundo plano
  • Umbral de advertencia de 75 % de uso del disco
  • Limpieza automática al superar los umbrales

Automatización del mantenimiento de infraestructura

Nuestra automatización de Ansible para la producción de Node.js:

Guía de implementación de producción de Node.js

Estudie nuestro código actual para conocer las mejores prácticas de producción

Comience con estos archivos clave para la configuración del entorno de producción de Node.js:

  1. Configuración: config/index.js
  2. Monitoreo: helpers/monitor-server.js
  3. Gestión de errores: helpers/is-code-bug.js
  4. Registro: helpers/logger.js
  5. Estado del proceso: jobs/check-pm2.js

Aprenda de nuestras publicaciones de blog

Nuestras guías de implementación técnica para la producción de Node.js:

Automatización de infraestructura para la producción de Node.js

Nuestros playbooks de Ansible para estudiar para la implementación de producción de Node.js:

Nuestros casos de estudio

Nuestras implementaciones empresariales:

Conclusión: Mejores prácticas de implementación de producción de Node.js

Nuestra infraestructura de producción Node.js demuestra que las aplicaciones Node.js pueden lograr una confiabilidad de nivel empresarial a través de:

  • Opciones de hardware probadas (AMD Ryzen para una optimización del rendimiento de un solo núcleo del 573 %)
  • Monitoreo de producción de Node.js probado en campo con umbrales específicos y respuestas automatizadas
  • Clasificación inteligente de errores para mejorar la respuesta a incidentes en entornos de producción
  • Depuración avanzada del rendimiento con v8-profiler-next y cpupro para la prevención de OOM
  • Refuerzo integral de la seguridad mediante la automatización de Ansible
  • Arquitectura de base de datos híbrida optimizada para las necesidades de la aplicación
  • Mantenimiento automatizado para prevenir problemas comunes de producción de Node.js

Conclusión clave: Estudie nuestros archivos de implementación y publicaciones de blog en lugar de seguir las mejores prácticas genéricas. Nuestro código base proporciona patrones reales para la implementación en producción de Node.js, adaptables a cualquier aplicación Node.js: aplicaciones web, API, microservicios o servicios en segundo plano.

Lista completa de recursos para la producción de Node.js

Nuestros archivos de implementación principales

Nuestras implementaciones de servidor

Nuestra Automatización de Infraestructura

Nuestras publicaciones de blog técnico

Nuestros estudios de caso empresariales