Optimiza las aplicaciones de Node.js para Cloud Run

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

Optimizar el tiempo de inicio

Al optimizar el tiempo de inicio, puede reducir la latencia, mejorar la capacidad de respuesta y lograr una optimización de costes eficaz. Esta sección describe diferentes maneras de optimizar el tiempo de arranque.

Inicia tu aplicación usando node en lugar de npm.

Inicie su aplicación directamente usando 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:

  • Utilice CMD node index.js en su Dockerfile, por ejemplo:

    CMD node index.js
    
  • Establezca node index.js como su punto de entrada. Ejecute el siguiente comando utilizando la 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 utiliza 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 de los empaquetadores incluyen 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 disminuyen el número de solicitudes de lectura de archivos. Los empaquetadores de JavaScript comunes son esbuild, webpack y rollup.

Dependencias de carga diferida

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, usar una ubicación remota genera latencia adicional cada vez que se lee un archivo. Los paquetes de Node.js pueden utilizar muchos archivos con dependencias indirectas. En lugar de importar todas las dependencias al inicio, recomendamos que solo cargue las dependencias necesarias para que su servidor se inicie y cargue las demás dependencias de forma diferida con importaciones dinámicas.

Por ejemplo, en lugar de usar import en la parte superior de su módulo, como import { Storage } from '@google-cloud/storage', use 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 su máquina, ejecute 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 construyen en el servidor 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).