Ce guide décrit les optimisations pour les services Cloud Run écrits en JavaScript ou TypeScript, et exécutés sur l'environnement d'exécution Node.js. Les informations contenues sur cette page viennent en complément des conseils généraux de développement, qui s'appliquent également à Node.js.
Optimiser le temps de démarrage
En optimisant le temps de démarrage, vous pouvez réduire la latence, améliorer la réactivité et optimiser efficacement les coûts. Cette section décrit différentes façons d'optimiser le temps de démarrage.
Démarrer votre application à l'aide de node au lieu de npm
Démarrez votre application directement à l'aide de node index.js au lieu de npm start,
car npm ajoute une latence supplémentaire.
Pour démarrer votre application avec node index.js, procédez de l'une des manières suivantes :
Utilisez
CMD node index.jsdans votre Dockerfile, par exemple :CMD node index.jsDéfinissez
node index.jscomme point d'entrée. Exécutez la commande suivante à l'aide de Google Cloud CLI :gcloud run deploy SERVICE --command "node index.js"Pour en savoir plus et découvrir d'autres options de configuration des points d'entrée, consultez Configurer des conteneurs pour les services.
Si vous utilisez des déploiements de code source sans Dockerfile, Cloud Run effectue l'optimisation.
Regrouper votre code
Un regroupeur est un outil de compilation qui optimise la mise en page de vos fichiers sources JavaScript pour accélérer les temps de chargement. Parmi les optimisations courantes des regroupeurs, on trouve le tree shaking, la minification et la fusion de petits fichiers. Les regroupeurs réduisent considérablement la taille totale du bundle et le nombre de requêtes de lecture de fichiers. Les regroupeurs JavaScript courants sont esbuild, webpack, et rollup.
Charger les dépendances de manière différée
Au démarrage, Cloud Run diffuse chaque fichier que votre code charge à partir d'un emplacement distant. Par rapport à un système de fichiers local, l'utilisation d'un emplacement distant entraîne une latence supplémentaire chaque fois qu'un fichier est lu. Les packages Node.js peuvent utiliser de nombreux fichiers avec des dépendances indirectes. Au lieu d'importer toutes les dépendances au démarrage, nous vous recommandons de ne charger que les dépendances nécessaires au démarrage de votre serveur, et de charger les autres dépendances de manière différée avec des importations dynamiques.
Par exemple, au lieu d'utiliser l'importation en haut de votre module, comme
import { Storage } from '@google-cloud/storage', utilisez import() dans la fonction
lorsqu'elle nécessite l'objet importé, par exemple :
const { Storage } = await import('@google-cloud/storage');
Pour identifier les modules qui se chargent au démarrage et le temps nécessaire au chargement de chaque module sur votre machine, exécutez la commande suivante :
node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js
Configurer le délai avant expiration
Dans Node.js version 14 et ultérieure, le serveur HTTP intégré a un délai avant expiration par défaut
de 0 (aucun délai avant expiration). Dans les versions de Node.js antérieures à la version 14, le délai avant expiration par défaut était de deux minutes. Si le délai avant expiration des requêtes de votre service Cloud Run est plus long, modifiez-le à l'aide de server.setTimeout(msecs). Vous devez également modifier le
délai avant expiration des frameworks basés sur le serveur Node.js, tels qu'
Express. Pour obtenir un délai avant expiration illimité dans Node.js et vous appuyer sur le délai avant expiration intégré de Cloud Run, utilisez server.setTimeout(0).