Accoda le funzioni con Cloud Tasks


Le funzioni di coda di attività sfruttano Google Cloud Tasks per aiutare la tua app a eseguire attività asincrone che richiedono molto tempo, richiedono molte risorse o hanno limitazioni di larghezza di banda al di fuori del flusso dell'applicazione principale.

Ad esempio, immagina di voler creare i backup di un ampio insieme di file di immagini attualmente ospitati su un'API con un limite di frequenza. Per essere un consumatore responsabile di tale API, devi rispettare i relativi limiti di frequenza. Inoltre, questo tipo di job a lungo termine potrebbe essere vulnerabile a errori a causa di timeout e limiti di memoria.

Per ridurre questa complessità, puoi scrivere una funzione di coda di attività che imposta opzioni di attività di base come scheduleTime e dispatchDeadline e poi la passa a una coda in Cloud Tasks. L'ambiente Cloud Tasks è progettato specificamente per garantire un controllo efficace della congestione e criteri di ripetizione per questo tipo di operazioni.

L'SDK Firebase per Cloud Functions for Firebase v3.20.1 e versioni successive interagisce con Firebase Admin SDK v10.2.0 e versioni successive per supportare le funzioni delle code di attività.

L'utilizzo delle funzioni di coda di attività con Firebase può comportare addebiti per l'elaborazioneCloud Tasks. Per ulteriori informazioni, consulta la pagina relativa ai prezzi di Cloud Tasks.

Creare funzioni di coda di attività

Per utilizzare le funzioni della coda di attività, segui questo flusso di lavoro:

  1. Scrivi una funzione di coda di attività utilizzando l'SDK Firebase per Cloud Functions.
  2. Testa la funzione attivandola con una richiesta HTTP.
  3. Esegui il deployment della funzione con l'interfaccia a riga di comando Firebase. Quando esegui il deployment della funzione di coda di attività per la prima volta, la CLI crea una coda di attività in Cloud Tasks con le opzioni (limitazione della frequenza e riprova) specificate nel codice sorgente.
  4. Aggiungi attività alla coda appena creata, trasmettendo i parametri per impostare una pianificazione di esecuzione, se necessario. Puoi farlo scrivendo il codice utilizzando Admin SDK e implementandolo in Cloud Functions for Firebase.

Scrittura funzioni coda di attività

Utilizza onDispatch per iniziare a scrivere funzioni per le code di attività. Un aspetto importante della scrittura di una funzione di coda di attività è impostare la configurazione di ripetizione per coda e di limitazione della frequenza. Gli esempi di codice in questa pagina si basano su un'app che configura un servizio che esegue il backup di tutte le immagini della Astronomy Picture of the Day della NASA:

Configura le funzioni della coda di attività

Le funzioni coda di attività dispongono di un set avanzato di impostazioni di configurazione per controllare con precisione i limiti di frequenza e il comportamento dei nuovi tentativi di una coda di attività:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5: per ogni attività nella coda viene eseguito automaticamente un nuovo tentativo fino a 5 volte. In questo modo è possibile ridurre gli errori temporanei come quelli di rete o l'interruzione temporanea del servizio di un servizio esterno dipendente.
  • retryConfig.minBackoffSeconds=60: ogni attività viene riprovata almeno 60 secondi dopo ogni tentativo. In questo modo avrai un ampio margine tra un tentativo e l'altro, così non corriamo ad esaurire i 5 nuovi tentativi troppo rapidamente.
  • rateLimits.maxConcurrentDispatch=6: vengono inviate al massimo 6 attività contemporaneamente. Ciò contribuisce a garantire un flusso costante di richieste alla funzione sottostante e a ridurre il numero di istanze attive e avvii a freddo.

Testare le funzioni della coda di attività

Nella maggior parte dei casi, l'emulatore Cloud Functions è il modo migliore per testare le funzioni di coda delle attività. Consulta la documentazione di Emulator Suite per scoprire come strumentare la tua app per l'emulazione delle funzioni delle code di attività.

Inoltre, le funzioni di coda di attività sono esposte come semplici funzioni HTTP nell'Firebase Local Emulator Suite. Puoi testare una funzione di task emulata inviando una richiesta POST HTTP con un payload di dati JSON:

 # start the Firebase Emulators
 firebase emulators:start

 # trigger the emulated task queue function
 curl \
  -X POST                                            # An HTTP POST request...
  -H "content-type: application/json" \              # ... with a JSON body
  http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
  -d '{"data": { ... some data .... }}'              # ... with JSON encoded data

Esegui il deployment delle funzioni di coda di attività

Esegui il deployment della funzione coda di attività utilizzando l'interfaccia a riga di comando di Firebase:

$ firebase deploy --only functions:backupApod

Quando esegui il deployment di una funzione di coda di attività per la prima volta, la CLI crea una coda di attività in Cloud Tasks con le opzioni (limite di frequenza e nuovo tentativo) specificate nel codice sorgente.

Se si verificano errori di autorizzazione durante il deployment delle funzioni, assicurati che i ruoli IAM appropriati siano assegnati all'utente che esegue i comandi di deployment.

Accoda le funzioni della coda di attività

Le funzioni di coda di attività possono essere inserite in coda in Cloud Tasks da un ambiente server attendibile come Cloud Functions for Firebase utilizzando Firebase Admin SDK per Node.js. Se non hai mai utilizzato i Admin SDK, consulta Aggiungere Firebase a un server per iniziare.

In un flusso di lavoro tipico, Admin SDK crea una nuova attività, la mette in coda in Cloud Tasks e ne imposta la configurazione:

exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
  const queue = getFunctions().taskQueue("backupApod");
  const enqueues = [];
  for (let i = 0; i <= 10; i += 1) {
    // Enqueue each task with i*60 seconds delay. Our task queue function
    // should process ~1 task/min.
    const scheduleDelaySeconds = i * 60 
    enqueues.push(
        queue.enqueue(
          { id: `task-${i}` },
          {
            scheduleDelaySeconds,
            dispatchDeadlineSeconds: 60 * 5 // 5 minutes
          },
        ),
    );
  }
  await Promise.all(enqueues);
  response.sendStatus(200);

});
  • scheduleDelaySeconds: il codice di esempio tenta di distribuire l'esecuzione delle attività associando un ritardo di N minuti per la N-esima attività. Ciò si traduce in un attivazione di ~ 1 attività/minuto. Tieni presente che puoi anche utilizzare scheduleTime se vuoi che Cloud Tasks attiri un'attività in un momento specifico.
  • dispatchDeadlineSeconds: tempo massimo che Cloud Tasks attenderà per il completamento di un'attività. Cloud Tasks proverà nuovamente a eseguire l'attività in base alla configurazione dei nuovi tentativi della coda o fino al raggiungimento di questa scadenza. Nel sample, la coda è configurata per riprovare l'attività fino a 5 volte, ma l'attività viene annullata automaticamente se l'intera procedura (inclusi i tentativi di ripetizione) richiede più di 5 minuti.

Risoluzione dei problemi

Cloud Tasks">Attiva il logging di Cloud Tasks

I log di Cloud Tasks contengono informazioni diagnostiche utili come lo stato della richiesta associata a un'attività. Per impostazione predefinita, i log di Cloud Tasks sono disattivati a causa dell'elevato volume di log che possono potenzialmente generare nel tuo progetto. Ti consigliamo di attivare i log di debug durante lo sviluppo e il debug delle funzioni della coda di attività. Vedi Attivare il logging.

Autorizzazioni IAM

Potresti visualizzare PERMISSION DENIED di errori quando accodi le attività o quando Cloud Tasks tenta di richiamare le funzioni delle code di attività. Assicurati che il progetto abbia le seguenti associazioni IAM:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • L'identità utilizzata per mettere in coda le attività in Cloud Tasks deve disporre dell'autorizzazione per utilizzare l'account di servizio associato a un'attività in Cloud Tasks.

    Nell'esempio, questo è l'account di servizio predefinito App Engine.

Consulta la documentazione di Google Cloud IAM per istruzioni su come aggiungere l'account di servizio predefinito App Engine come utente dell'account di servizio predefinito App Engine.

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker