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.jsen tu Dockerfile, por ejemplo:CMD node index.jsEstablece
node index.jscomo 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).