Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Suggerimenti e trucchi

Questo documento descrive le migliori pratiche per la progettazione, l'implementazione, il test e la distribuzione di funzioni cloud.

correttezza

Questa sezione descrive le migliori pratiche generali per la progettazione e l'implementazione di funzioni cloud.

Scrivi funzioni idempotenti

Le tue funzioni dovrebbero produrre lo stesso risultato anche se vengono chiamate più volte. Ciò consente di riprovare una chiamata se la chiamata precedente non riesce parzialmente nel codice. Per ulteriori informazioni, vedere riprovare le funzioni in background .

Non avviare attività in background

L'attività in background è tutto ciò che accade dopo che la funzione è terminata. L'invocazione di una funzione termina quando la funzione restituisce o altrimenti segnala il completamento, ad esempio chiamando l'argomento callback nelle funzioni in background Node.js. Qualsiasi codice eseguito dopo una chiusura graduale non può accedere alla CPU e non farà alcun progresso.

Inoltre, quando viene eseguita una successiva chiamata nello stesso ambiente, l'attività in background riprende, interferendo con la nuova chiamata. Ciò può comportare comportamenti imprevisti ed errori difficili da diagnosticare. L'accesso alla rete al termine di una funzione comporta generalmente il ripristino delle connessioni (codice di errore ECONNRESET ).

L'attività in background può spesso essere rilevata nei registri da singole invocazioni, trovando tutto ciò che viene registrato dopo la riga che dice che l'invocazione è terminata. A volte l'attività in background può essere nascosta più in profondità nel codice, specialmente quando sono presenti operazioni asincrone come callback o timer. Rivedere il codice per assicurarsi che tutte le operazioni asincrone finiscano prima di terminare la funzione.

Elimina sempre i file temporanei

L'archiviazione su disco locale nella directory temporanea è un file system in memoria. I file che scrivi consumano memoria disponibile per la tua funzione e talvolta persistono tra le chiamate. La mancata eliminazione esplicita di questi file può eventualmente portare a un errore di memoria insufficiente e un successivo avvio a freddo.

Puoi vedere la memoria utilizzata da una singola funzione selezionandola nell'elenco delle funzioni nella Console GCP e scegliendo il diagramma di utilizzo della memoria .

Non tentare di scrivere al di fuori della directory temporanea e assicurarsi di utilizzare metodi indipendenti dalla piattaforma / dal sistema operativo per costruire percorsi di file.

È possibile ignorare le restrizioni di dimensione sui file temporanei utilizzando il pipelining. Ad esempio, è possibile elaborare un file su Cloud Storage creando un flusso di lettura, passandolo attraverso un processo basato su flusso e scrivendo il flusso di output direttamente su Cloud Storage.

Strumenti

Questa sezione fornisce linee guida su come utilizzare gli strumenti per implementare, testare e interagire con le funzioni cloud.

Sviluppo locale

La distribuzione della funzione richiede un po 'di tempo, quindi spesso è più veloce testare il codice della funzione localmente.

Gli sviluppatori di Firebase possono utilizzare l' emulatore di funzioni cloud della CLI di Firebase .

Usa Sendgrid per inviare e-mail

Le funzioni cloud non consentono connessioni in uscita sulla porta 25, quindi non è possibile effettuare connessioni non sicure a un server SMTP. Il modo consigliato per inviare e-mail è utilizzare SendGrid . Puoi trovare un esempio completo nel Tutorial SendGrid e altre opzioni per l'invio di email nel documento di Google Compute Engine Invio di email da un'istanza .

performance

Questa sezione descrive le migliori pratiche per l'ottimizzazione delle prestazioni.

Usa le dipendenze con saggezza

Poiché le funzioni sono senza stato, l'ambiente di esecuzione viene spesso inizializzato da zero (durante ciò che è noto come avvio a freddo ). Quando si verifica un avvio a freddo, viene valutato il contesto globale della funzione.

Se le funzioni importano moduli, il tempo di caricamento per tali moduli può aumentare la latenza di chiamata durante un avvio a freddo. È possibile ridurre questa latenza, nonché il tempo necessario per distribuire la funzione, caricando correttamente le dipendenze e non caricando dipendenze che la funzione non utilizza.

Utilizzare le variabili globali per riutilizzare gli oggetti nelle invocazioni future

Non vi è alcuna garanzia che lo stato di una funzione cloud venga conservato per invocazioni future. Tuttavia, le funzioni cloud spesso riciclano l'ambiente di esecuzione di una precedente chiamata. Se si dichiara una variabile nell'ambito globale, il suo valore può essere riutilizzato nelle successive chiamate senza dover essere ricalcolato.

In questo modo è possibile memorizzare nella cache oggetti che possono essere costosi da ricreare su ogni chiamata di funzione. Lo spostamento di tali oggetti dal corpo della funzione all'ambito globale può comportare miglioramenti significativi delle prestazioni. L'esempio seguente crea un oggetto pesante solo una volta per istanza di funzione e lo condivide tra tutte le chiamate di funzioni che raggiungono l'istanza specificata:

 console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
 

È particolarmente importante memorizzare nella cache connessioni di rete, riferimenti a librerie e oggetti client API nell'ambito globale. Vedere Ottimizzazione della rete per esempi.

Inizializzazione pigra delle variabili globali

Se si inizializzano variabili in ambito globale, il codice di inizializzazione verrà sempre eseguito tramite un richiamo di avvio a freddo, aumentando la latenza della funzione. Se alcuni oggetti non vengono utilizzati in tutti i percorsi del codice, prendere in considerazione l'inizializzazione pigramente su richiesta:

 const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});
 

Ciò è particolarmente importante se si definiscono più funzioni in un singolo file e funzioni diverse utilizzano variabili diverse. A meno che non si utilizzi l'inizializzazione lenta, è possibile sprecare risorse su variabili inizializzate ma mai utilizzate.

Risorse aggiuntive

Scopri di più sull'ottimizzazione delle prestazioni nel video "Google Cloud Performance Atlas" Funzioni cloud Tempo di avvio a freddo .