Funktionen mit Cloud Tasks in die Warteschlange stellen


Aufgabenwarteschlangen nutzen Google Cloud Tasks, um zeitaufwendige, ressourcenintensive oder bandbreitenbegrenzte Aufgaben asynchron außerhalb des Hauptanwendungsablaufs auszuführen.

Stellen Sie sich beispielsweise vor, Sie möchten Sicherungen eines großen Satzes von Bilddateien erstellen, die derzeit von einer API mit einer Ratenbegrenzung gehostet werden. Als verantwortungsvoller Nutzer dieser API müssen Sie deren Ratenbegrenzungen einhalten. Außerdem kann diese Art von Jobs mit langer Ausführungszeit aufgrund von Zeitüberschreitungen und Arbeitsspeicherlimits anfällig für Fehler sein.

Um diese Komplexität zu verringern, können Sie eine Task-Queue-Funktion schreiben, die grundlegende Aufgabenoptionen wie scheduleTime und dispatchDeadline festlegt und die Funktion dann an eine Queue in Cloud Tasks weitergibt. Die Cloud Tasks-Umgebung wurde speziell für eine effektive Staukontrolle und Wiederholrichtlinien für diese Art von Vorgängen entwickelt.

Das Firebase SDK für Cloud Functions for Firebase Version 3.20.1 und höher ist mit Firebase Admin SDK Version 10.2.0 und höher kompatibel und unterstützt Aufgabenwarteschlangenfunktionen.

Wenn Sie Aufgabenwarteschlangenfunktionen mit Firebase verwenden, können Gebühren für die Cloud Tasks-Verarbeitung anfallen. Weitere Informationen finden Sie unter Cloud Tasks-Preise.

Funktionen für Aufgabenwarteschlangen erstellen

Gehen Sie folgendermaßen vor, um Funktionen für Aufgabenwarteschlangen zu verwenden:

  1. Schreiben Sie mit dem Firebase SDK für Cloud Functions eine Aufgabenwarteschlangenfunktion.
  2. Testen Sie die Funktion, indem Sie sie mit einer HTTP-Anfrage auslösen.
  3. Stellen Sie die Funktion mit der Firebase-Befehlszeile bereit. Wenn Sie die Aufgabenwarteschlangenfunktion zum ersten Mal bereitstellen, erstellt die Befehlszeile in Cloud Tasks eine Aufgabenwarteschlange mit Optionen (Ratenbegrenzung und Wiederholungsversuch), die im Quellcode angegeben sind.
  4. Fügen Sie der neu erstellten Aufgabenwarteschlange Aufgaben hinzu und übergeben Sie bei Bedarf Parameter zum Einrichten eines Ausführungszeitplans. Sie können dies erreichen, indem Sie den Code mit Admin SDK schreiben und auf Cloud Functions for Firebase bereitstellen.

Aufgabenwarteschlangenfunktionen schreiben

Verwenden Sie onDispatch, um mit dem Schreiben von Funktionen für Aufgabenwarteschlangen zu beginnen. Ein wichtiger Teil beim Schreiben einer Aufgabenwarteschlangenfunktion besteht darin, Wiederholungsversuche und Ratenbegrenzungen für jede Warteschlange festzulegen. Codebeispiele auf dieser Seite basieren auf einer App, die einen Dienst einrichtet, der alle Bilder des Astronomy Picture of the Day der NASA sichert:

Funktionen für Aufgabenwarteschlangen konfigurieren

Aufgabenwarteschlangen-Funktionen umfassen leistungsstarke Konfigurationseinstellungen, mit denen Sie Ratenbegrenzungen und Wiederholungsverhalten einer Aufgabenwarteschlange genau steuern können:

exports.backupApod = functions
    .runWith( {secrets: ["NASA_API_KEY"]})
    .tasks.taskQueue({
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }).onDispatch(async (data) => {
  • retryConfig.maxAttempts=5: Jede Aufgabe in der Aufgabenwarteschlange wird automatisch bis zu fünfmal wiederholt. So lassen sich vorübergehende Fehler wie Netzwerkfehler oder vorübergehende Dienstunterbrechungen eines abhängigen externen Dienstes abmildern.
  • retryConfig.minBackoffSeconds=60: Jede Aufgabe wird im Abstand von mindestens 60 Sekunden wiederholt. So haben wir zwischen den einzelnen Versuchen einen großen Puffer, sodass wir die fünf Wiederholungsversuche nicht zu schnell aufbrauchen.
  • rateLimits.maxConcurrentDispatch=6: Es werden maximal sechs Aufgaben auf einmal weitergeleitet. Dadurch wird ein kontinuierlicher Strom von Anfragen an die zugrunde liegende Funktion sichergestellt und die Anzahl der aktiven Instanzen und Kaltstarts reduziert.

Funktionen der Aufgabenwarteschlange testen

In den meisten Fällen ist der Cloud Functions-Emulator die beste Möglichkeit, um Funktionen von Aufgabenwarteschlangen zu testen. In der Emulator Suite-Dokumentation erfahren Sie, wie Sie Ihre Anwendung für die Emulation von Aufgabenwarteschlangenfunktionen instrumentieren.

Darüber hinaus werden Aufgabenwarteschlangenfunktionen in der Firebase Local Emulator Suite als einfache HTTP-Funktionen bereitgestellt. Sie können eine emulierte Aufgabenfunktion testen, indem Sie eine HTTP-POST-Anfrage mit einer JSON-Datennutzlast senden:

 # 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

Aufgabenwarteschlangenfunktionen bereitstellen

Task-Queue-Funktion mit der Firebase CLI bereitstellen:

$ firebase deploy --only functions:backupApod

Wenn Sie eine Aufgabenwarteschlangenfunktion zum ersten Mal bereitstellen, erstellt die Befehlszeile in Cloud Tasks eine Aufgabenwarteschlange mit Optionen (Ratenbegrenzung und Wiederholung), die im Quellcode angegeben sind.

Wenn beim Bereitstellen von Funktionen Berechtigungsfehler auftreten, prüfen Sie, ob dem Nutzer, der die Bereitstellungsbefehle ausführt, die entsprechenden IAM-Rollen zugewiesen sind.

Funktionen für Aufgabenwarteschlangen in der Warteschlange

Aufgabenqueue-Funktionen können in Cloud Tasks aus einer vertrauenswürdigen Serverumgebung wie Cloud Functions for Firebase mithilfe der Firebase Admin SDK für Node.js in die Warteschlange gestellt werden. Wenn Sie die Admin SDK zum ersten Mal verwenden, lesen Sie Firebase zu einem Server hinzufügen.

In einem typischen Ablauf erstellt Admin SDK eine neue Aufgabe, stellt sie in Cloud Tasks in die Warteschlange und legt die Konfiguration für die Aufgabe fest:

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: Der Beispielcode versucht, die Ausführung von Aufgaben zu verteilen. Dazu wird der n-ten Aufgabe eine Verzögerung von N-ten Minuten zugeordnet. Das entspricht etwa einer Aufgabe pro Minute. Sie können auch scheduleTime verwenden, wenn Cloud Tasks eine Aufgabe zu einer bestimmten Zeit auslösen soll.
  • dispatchDeadlineSeconds: Die maximale Zeit, die Cloud Tasks auf den Abschluss einer Aufgabe wartet. Bei Cloud Tasks wird die Aufgabe gemäß der Wiederholungskonfiguration der Warteschlange oder bis zu diesem Termin wiederholt. Im Beispiel ist die Warteschlange so konfiguriert, dass die Aufgabe bis zu fünfmal wiederholt wird. Die Aufgabe wird jedoch automatisch abgebrochen, wenn der gesamte Prozess (einschließlich Wiederholungsversuche) mehr als 5 Minuten dauert.

Fehlerbehebung

Cloud Tasks">Cloud Tasks-Logging aktivieren

Logs von Cloud Tasks enthalten nützliche Diagnoseinformationen wie den Status der Anfrage, die mit einer Aufgabe verknüpft ist. Standardmäßig sind Logs von Cloud Tasks aufgrund des großen Logvolumens, das möglicherweise für Ihr Projekt generiert werden kann, deaktiviert. Wir empfehlen, die Debug-Logs zu aktivieren, während Sie Ihre Task-Queue-Funktionen aktiv entwickeln und debuggen. Weitere Informationen finden Sie unter Logging aktivieren.

IAM-Berechtigungen

Wenn Sie Aufgaben in die Warteschlange stellen oder Cloud Tasks versucht, die Funktionen der Aufgabenwarteschlange aufzurufen, werden möglicherweise PERMISSION DENIED-Fehler angezeigt. Prüfen Sie, ob Ihr Projekt die folgenden IAM-Bindungen hat:

  • Die Identität, die zum Einreihen von Aufgaben in die Warteschlange für Cloud Tasks verwendet wird, benötigt die IAM-Berechtigung cloudtasks.tasks.create.

    Im Beispiel ist das das App Engine-Standarddienstkonto.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • Die Identität, die verwendet wird, um Aufgaben in Cloud Tasks in die Warteschlange zu stellen, benötigt die Berechtigung, das Dienstkonto zu verwenden, das einer Aufgabe in Cloud Tasks zugeordnet ist.

    Im Beispiel ist das das App Engine-Standarddienstkonto.

In der Google Cloud IAM-Dokumentation wird beschrieben, wie Sie das Standarddienstkonto App Engine als Nutzer des Standarddienstkontos App Engine hinzufügen.

  • Die zum Auslösen der Aufgabenwarteschlangenfunktion verwendete Identität benötigt die Berechtigung cloudfunctions.functions.invoke.

    Im Beispiel ist das das App Engine-Standarddienstkonto.

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