Optimizar aplicaciones Node.js para Cloud Run

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

Optimizar el tiempo de inicio

Si optimizas el tiempo de inicio, puedes reducir la latencia, mejorar la capacidad de respuesta y optimizar los costes de forma eficaz. En esta sección se describen diferentes formas de optimizar el tiempo de inicio.

Iniciar tu aplicación con node en lugar de npm

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

Para iniciar tu solicitud 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 punto de entrada. Ejecuta el siguiente comando con la CLI de Google Cloud:

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

    Para obtener más información y opciones sobre cómo configurar los puntos de entrada, consulta el artículo Configurar contenedores para servicios.

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

Agrupar el código

Un empaquetador 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 habituales de los empaquetadores son la eliminación de código no utilizado, la minificación y la fusión de archivos pequeños. Los empaquetadores reducen significativamente el tamaño total del paquete y el número de solicitudes de lectura de archivos. Algunas herramientas de creación de paquetes de JavaScript habituales son esbuild, webpack y rollup.

Cargar dependencias en diferido

Al iniciarse, Cloud Run transmite en streaming 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 conlleva 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 necesarias para que se inicie el servidor y que cargues las demás de forma diferida 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

Configurar 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 mayor, modifica el tiempo de espera con server.setTimeout(msecs). También debes modificar el tiempo de espera de los frameworks que se hayan creado en el servidor Node.js, como Express. Para conseguir un tiempo de espera ilimitado en Node.js y usar el tiempo de espera integrado de Cloud Run, utiliza server.setTimeout(0).