Node.js-Anwendungen für Cloud Run optimieren

In dieser Anleitung werden Optimierungen für Cloud Run-Dienste beschrieben, die in JavaScript oder TypeScript geschrieben wurden und in der Node.js-Laufzeit ausgeführt werden. Die Informationen auf dieser Seite ergänzen die allgemeinen Entwicklungstipps, die auch für Node.js gelten.

Startzeit optimieren

Durch die Optimierung der Startzeit können Sie die Latenz reduzieren, die Reaktionsfähigkeit verbessern und Kosten effektiv optimieren. In diesem Abschnitt werden verschiedene Möglichkeiten zur Optimierung der Startzeit beschrieben.

App mit node anstelle von npm starten

Starten Sie Ihre Anwendung direkt mit node index.js anstelle von npm start, da npm zusätzliche Latenz verursacht.

Folgen Sie einer der folgenden Methoden, um Ihre Anwendung mit node index.js zu starten:

  • Verwenden Sie in Ihrem Dockerfile CMD node index.js:

    CMD node index.js
    
  • Legen Sie node index.js als Einstiegspunkt fest. Führen Sie den folgenden Befehl mit der Google Cloud CLI aus:

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

    Weitere Informationen und Optionen zum Konfigurieren von Einstiegspunkten finden Sie unter Container für Dienste konfigurieren.

Wenn Sie Quellcodebereitstellungen ohne Dockerfile verwenden, führt Cloud Run die Optimierung durch.

Code bündeln

Ein Bundler ist ein Build-Tool, das das Layout Ihrer JavaScript-Quelldateien für schnellere Ladezeiten optimiert. Zu den gängigen Bundler-Optimierungen gehören Tree Shaking, Minifizierung und das Zusammenführen kleiner Dateien. Bundler reduzieren die Gesamtgröße des Bundles und die Anzahl der Dateileseanfragen erheblich. Gängige JavaScript-Bundler sind esbuild, webpack und rollup.

Abhängigkeiten verzögert laden

Beim Start streamt Cloud Run jede Datei, die Ihr Code von einem Remote-Standort lädt. Im Vergleich zu einem lokalen Dateisystem führt die Verwendung eines Remote-Standorts jedes Mal, wenn eine Datei gelesen wird, zu zusätzlicher Latenz. Node.js-Pakete können viele Dateien mit indirekten Abhängigkeiten verwenden. Anstatt alle Abhängigkeiten beim Start zu importieren, empfehlen wir, nur die Abhängigkeiten zu laden, die für den Start Ihres Servers erforderlich sind, und die anderen Abhängigkeiten mit dynamischen Importen verzögert zu laden.

Verwenden Sie beispielsweise anstelle von import oben in Ihrem Modul wie import { Storage } from '@google-cloud/storage', verwenden Sie import() in der Funktion wenn das importierte Objekt erforderlich ist:

const { Storage } = await import('@google-cloud/storage');

Führen Sie den folgenden Befehl aus, um die Module zu ermitteln, die beim Start geladen werden, und die Zeit, die für das Laden der einzelnen Module auf Ihrem Computer benötigt wird:

node --trace-event-categories node.module_timer --trace-event-file-pattern 'trace-events.log' index.js

Zeitlimit konfigurieren

In Node.js Version 14 und höher hat der integrierte HTTP-Server ein Standardzeitlimit von 0 (kein Zeitlimit). In Node.js-Versionen vor 14 betrug das Standardzeitlimit 2 Minuten. Wenn das Zeitlimit für Anfragen Ihres Cloud Run-Dienstes länger ist, ändern Sie das Zeitlimit mit server.setTimeout(msecs). Sie müssen das Zeitlimit auch für Frameworks ändern, die auf dem Node.js-Server basieren, z. B. Express. Verwenden Sie server.setTimeout(0), um in Node.js ein unbegrenztes Zeitlimit zu erreichen und das integrierte Zeitlimit von Cloud Run zu nutzen.