Optimiza las aplicaciones de Node.js para Cloud Run

En esta guía, se describen las optimizaciones para los servicios de Cloud Run escritos en JavaScript o TypeScript que se ejecutan en el entorno de ejecución de Node.js. La información de esta página complementa las sugerencias de desarrollo generales que también se aplican a Node.js.

Optimiza el tiempo de inicio

Si optimizas el tiempo de inicio, puedes reducir la latencia, mejorar la capacidad de respuesta y lograr una optimización de costos eficaz. En esta sección, se describen diferentes formas de optimizar el tiempo de inicio.

Inicia tu app con node en lugar de npm

Inicia tu aplicación directamente con node index.js en lugar de npm start, ya que npm agrega latencia adicional.

Para iniciar tu aplicación con node index.js, sigue uno de estos métodos:

  • Usa CMD node index.js en tu Dockerfile, por ejemplo:

    CMD node index.js
    
  • Establece node index.js como tu punto de entrada. Ejecuta el siguiente comando con Google Cloud CLI:

    gcloud run deploy SERVICE --command "node index.js"
    

    Para obtener más información y opciones para configurar los puntos de entrada, consulta Configura contenedores para servicios.

Si usas implementaciones de origen sin un Dockerfile, Cloud Run realiza la optimización.

Agrupa tu código

Un agrupador es una herramienta de compilación que optimiza el diseño de tus archivos de origen de JavaScript para que los tiempos de carga sean más rápidos. Algunas optimizaciones comunes del agrupador incluyen la eliminación de código no utilizado, la minimización y la fusión de archivos pequeños. Los agrupadores reducen significativamente el tamaño total del paquete y la cantidad de solicitudes de lectura de archivos. Los agrupadores de JavaScript comunes son esbuild, webpack y rollup.

Carga diferida de dependencias

Al inicio, Cloud Run transmite cada archivo que carga tu código desde una ubicación remota. En comparación con un sistema de archivos local, el uso de una ubicación remota genera una latencia adicional cada vez que se lee un archivo. Los paquetes de Node.js pueden usar muchos archivos con dependencias indirectas. En lugar de importar todas las dependencias al inicio, te recomendamos que solo cargues las dependencias que requiere tu servidor para iniciarse y que cargues de forma diferida las otras dependencias con importaciones dinámicas.

Por ejemplo, en lugar de usar import en la parte superior de tu módulo, como import { Storage } from '@google-cloud/storage', usa import() en la función cuando requiera el objeto importado, por ejemplo:

const { Storage } = await import('@google-cloud/storage');

Para identificar los módulos que se cargan durante el inicio y el tiempo que tarda cada módulo en cargarse en tu máquina, ejecuta el siguiente comando:

node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js

Configura el tiempo de espera

En Node.js versión 14 y posteriores, el servidor HTTP integrado tiene un tiempo de espera predeterminado de 0 (sin tiempo de espera). En las versiones de Node.js anteriores a la 14, el tiempo de espera predeterminado era de 2 minutos. Si el tiempo de espera de la solicitud de tu servicio de Cloud Run es más largo, modifica el tiempo de espera con server.setTimeout(msecs). También debes modificar el tiempo de espera para los frameworks que se compilan en el servidor de Node.js, como Express. Para lograr un tiempo de espera ilimitado en Node.js y depender del tiempo de espera integrado de Cloud Run, usa server.setTimeout(0).