Optimiser les applications Node.js pour Cloud Run

Ce guide décrit les optimisations pour les services Cloud Run écrits en JavaScript ou TypeScript, exécutés sur l'environnement d'exécution Node.js. Les informations de cette page complètent les 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 manières d'optimiser le temps de démarrage.

Démarrez votre application en utilisant node au lieu de npm.

Démarrez votre application directement en utilisant node index.js au lieu de npm start, car npm ajoute une latence supplémentaire.

Pour démarrer votre application avec node index.js, suivez l'une de ces méthodes :

  • Utilisez CMD node index.js dans votre Dockerfile, par exemple :

    CMD node index.js
    
  • Définissez node index.js comme point d'entrée. Exécutez la commande suivante à l'aide de l'Google Cloud CLI :

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

    Pour en savoir plus et découvrir les options de configuration des points d'entrée, consultez Configurer des conteneurs pour les services.

Si vous utilisez des déploiements sources sans Dockerfile, Cloud Run effectue l'optimisation.

Regroupez votre code

Un bundler est un outil de construction qui optimise la mise en page de vos fichiers sources JavaScript pour des temps de chargement plus rapides. Parmi les optimisations courantes des outils de regroupement de fichiers, on peut citer le tree shaking, la minification et la fusion des petits fichiers. Les outils de regroupement réduisent considérablement la taille totale du paquet et le nombre de requêtes de lecture de fichiers. Les outils de regroupement JavaScript courants sont esbuild, webpack et rollup.

Dépendances à chargement différé

Au démarrage, Cloud Run diffuse en streaming chaque fichier que votre code charge à partir d'un emplacement distant. Comparativement à un système de fichiers local, l'utilisation d'un emplacement distant entraîne une latence supplémentaire à chaque lecture de fichier. 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 dynamic imports.

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 a besoin de 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 à chaque module pour se charger 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 d'attente

Dans Node.js version 14 et ultérieures, le serveur HTTP intégré a un délai d'attente par défaut de 0 (pas de délai d'attente). 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 d'expiration de la requête de votre service Cloud Run est plus long, modifiez le délai d'expiration en utilisant server.setTimeout(msecs). Vous devez également modifier le délai d'expiration pour les frameworks construits sur le serveur Node.js, tels que Express. Pour obtenir un délai d'expiration illimité dans Node.js et pour s'appuyer sur le délai d'expiration intégré de Cloud Run, utilisez server.setTimeout(0).