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 contenues sur cette page viennent en complément des conseils de développement généraux, 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émarrez 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, suivez l'une des méthodes suivantes :

  • Utilisez CMD node index.js dans votre fichier 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 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 de code source sans Dockerfile, Cloud Run effectue l'optimisation.

Regrouper votre code

Un bundler est un outil de compilation qui optimise la mise en page de vos fichiers sources JavaScript pour des temps de chargement plus rapides. Voici quelques optimisations courantes des bundlers : tree shaking, minification et regroupement des petits fichiers. Les bundlers 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 en streaming 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 celles nécessaires au démarrage de votre serveur et de charger les autres dépendances de manière différée avec les importations dynamiques.

Par exemple, au lieu d'utiliser import 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

Le serveur HTTP intégré à Node.js a un délai avant expiration par défaut 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 pour les frameworks basés sur le serveur Node.js, tels qu'Express. Pour obtenir un délai avant expiration illimité dans Node.js et s'appuyer sur le délai avant expiration intégré de Cloud Run, utilisez server.setTimeout(0).