Ottimizza le applicazioni Node.js per Cloud Run

Questa guida descrive le ottimizzazioni per i servizi Cloud Run scritti in JavaScript o TypeScript, eseguiti sull'ambiente di runtime Node.js. Le informazioni contenute in questa pagina integrano i suggerimenti generali per lo sviluppo, che si applicano anche a Node.js.

Ottimizzare il tempo di avvio

Ottimizzando i tempi di avvio, è possibile ridurre la latenza, migliorare la reattività e ottenere un'efficace ottimizzazione dei costi. Questa sezione descrive diversi modi per ottimizzare i tempi di avvio.

Avvia la tua app usando node invece di npm

Avvia la tua applicazione direttamente usando node index.js invece di npm start, poiché npm aggiunge latenza extra.

Per avviare la tua applicazione con node index.js, segui uno di questi metodi:

  • Utilizza CMD node index.js nel tuo Dockerfile, ad esempio:

    CMD node index.js
    
  • Imposta node index.js come punto di ingresso. Eseguire il seguente comando utilizzando Google Cloud CLI:

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

    Per ulteriori informazioni e opzioni per la configurazione dei punti di ingresso, vedere Configurare i contenitori per i servizi.

Se si utilizzano distribuzioni sorgente senza un Dockerfile, Cloud Run esegue l'ottimizzazione.

Raggruppa il tuo codice

Un bundler è uno strumento di compilazione che ottimizza la struttura dei file sorgente JavaScript per velocizzare i tempi di caricamento. Alcune ottimizzazioni comuni utilizzate dai bundler includono il tree shaking, la minimizzazione e l'unione di file di piccole dimensioni. I bundler riducono significativamente le dimensioni totali del pacchetto e diminuiscono il numero di richieste di lettura dei file. I bundler JavaScript più comuni sono esbuild, webpack e rollup.

Dipendenze caricate in modo differito

All'avvio, Cloud Run trasmette in streaming ogni file caricato dal codice da una posizione remota. Rispetto a un file system locale, l'utilizzo di una posizione remota comporta una latenza aggiuntiva ogni volta che un file viene letto. I pacchetti Node.js potrebbero utilizzare molti file con dipendenze indirette. Invece di importare tutte le dipendenze all'avvio, consigliamo di caricare solo le dipendenze necessarie per l'avvio del server e di caricare in modo differito le altre dipendenze con importazioni dinamiche.

Ad esempio, invece di usare `import` all'inizio del modulo, come `import { Storage } from '@google-cloud/storage'`, usa `import()` nella funzione quando è necessario l'oggetto importato, ad esempio:

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

Per identificare i moduli che vengono caricati all'avvio e il tempo impiegato da ciascun modulo per caricarsi sul computer, eseguire il seguente comando:

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

Configura il timeout

Nelle versioni di Node.js dalla 14 in poi, il server HTTP integrato ha un timeout predefinito di 0 (nessun timeout). Nelle versioni di Node.js precedenti alla 14, il timeout predefinito era di 2 minuti. Se il timeout della richiesta del servizio Cloud Run è più lungo, modifica il timeout utilizzando server.setTimeout(msecs). È inoltre necessario modificare il timeout per i framework che sono costruiti sul server Node.js, come Express. Per ottenere un timeout illimitato in Node.js e per utilizzare il timeout integrato di Cloud Run, usa server.setTimeout(0).