Ottimizza le applicazioni Node.js per Cloud Run

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

Ottimizzare il tempo di avvio

Ottimizzando il tempo di avvio, puoi ridurre la latenza, migliorare la reattività e ottenere un'ottimizzazione efficace dei costi. Questa sezione descrive diversi modi per ottimizzare il tempo di avvio.

Avviare l'app utilizzando node anziché npm

Avvia l'applicazione direttamente utilizzando node index.js anziché npm start, poiché npm aggiunge una latenza extra.

Per avviare l'applicazione con node index.js, segui uno di questi metodi:

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

    CMD node index.js
    
  • Imposta node index.js come punto di ingresso. Esegui 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, consulta Configurare i container per i servizi.

Se utilizzi i deployment del codice sorgente senza un Dockerfile, Cloud Run esegue l'ottimizzazione.

Creare un bundle del codice

Un bundler è uno strumento di build che ottimizza il layout dei file di origine JavaScript per tempi di caricamento più rapidi. Alcune ottimizzazioni comuni dei bundler includono tree shaking, la minimizzazione e l'unione di file di piccole dimensioni. I bundler riducono notevolmente le dimensioni totali del bundle e il numero di richieste di lettura dei file. I bundler JavaScript comuni sono esbuild, webpack e rollup.

Caricare le dipendenze in modo differito

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

Ad esempio, anziché utilizzare l'importazione nella parte superiore del modulo, ad esempio import { Storage } from '@google-cloud/storage', utilizza import() nella funzione quando richiede l'oggetto importato, ad esempio:

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

Per identificare i moduli caricati durante l'avvio e il tempo impiegato da ogni modulo per caricarsi sulla tua macchina, esegui il seguente comando:

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

Configurare il timeout

In Node.js versione 14 e successive, 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). Devi anche modificare il timeout per i framework basati sul server Node.js, come Express. Per ottenere un timeout illimitato in Node.js e fare affidamento sul timeout integrato di Cloud Run, utilizza server.setTimeout(0).