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 generales para el desarrollo, 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 conocer las opciones para configurar los puntos de entrada, consulta Configura contenedores para servicios.

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

Agrupa tu código

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

Carga diferida de dependencias

Al inicio, Cloud Run transmite cada archivo que tu código carga desde una ubicación remota. En comparación con un sistema de archivos local, usar una ubicación remota genera 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 necesarias para que se inicie el servidor y que cargues de forma diferida las demás dependencias con importaciones dinámicas.

Por ejemplo, en lugar de usar import en la parte superior del 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

El servidor HTTP integrado de Node.js tiene un tiempo de espera predeterminado de dos 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 compilados 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).