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.

Angenommen, Sie möchten Sicherungen einer großen Anzahl von Bilddateien erstellen, die derzeit in einer API mit einem Ratelimit gehostet werden. Wenn Sie diese API verantwortungsvoll nutzen möchten, müssen Sie die Ratenlimits einhalten. Außerdem sind diese Arten von lang laufenden Jobs aufgrund von Zeitüberschreitungen und Arbeitsspeicherlimits anfällig für Fehler.

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 Überlastungskontrolle 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.

Die Verwendung von TaskQueue-Funktionen mit Firebase kann zu Kosten für die Cloud Tasks-Verarbeitung führen. Weitere Informationen finden Sie unter Cloud Tasks Preise.

Funktionen für Aufgabenwarteschlangen erstellen

So verwenden Sie Funktionen für Aufgabenwarteschlangen:

  1. Mit dem Firebase SDK für Cloud Functions eine Task-Warteschlangenfunktion schreiben
  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 Task-Queue-Funktion zum ersten Mal bereitstellen, wird in der Befehlszeile eine Task-Queue in Cloud Tasks mit den Optionen „Ratenbegrenzung“ und „Wiederholen“ erstellt, die in Ihrem Quellcode angegeben sind.
  4. Fügen Sie der neu erstellten Aufgabenwarteschlange Aufgaben hinzu und übergeben Sie bei Bedarf Parameter, um einen Ausführungszeitplan einzurichten. Sie können dies erreichen, indem Sie den Code mit Admin SDK schreiben und auf Cloud Functions for Firebase bereitstellen.

Aufgabenwarteschlangenfunktionen schreiben

Mit onDispatch können Sie erste Schritte mit dem Schreiben von Funktionen für Aufgabenwarteschlangen machen. Ein wichtiger Teil beim Schreiben einer Task-Queue-Funktion besteht darin, die Konfiguration für die Wiederholung und die Ratenbegrenzung pro Warteschlange festzulegen. Die Codebeispiele auf dieser Seite basieren auf einer App, mit der ein Dienst eingerichtet wird, der alle Bilder aus dem Astronomy Picture of the Day der NASA sichert:

Funktionen der Aufgabenwarteschlange konfigurieren

Aufgabenwarteschlangenfunktionen bieten eine Reihe leistungsstarker Konfigurationseinstellungen, mit denen sich die Ratenbeschränkungen und das Wiederholungsverhalten einer Aufgabenwarteschlange genau steuern lassen:

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: Bei jeder Aufgabe wird mindestens 60 Sekunden nach dem vorherigen Versuch ein neuer Versuch unternommen. 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 jeweils maximal 6 Aufgaben gesendet. So wird ein konstanter Fluss von Anfragen an die zugrunde liegende Funktion sichergestellt und die Anzahl der aktiven Instanzen und Kaltstarts reduziert.

Aufgabenwarteschlangenfunktionen testen

In den meisten Fällen eignet sich der Cloud Functions-Emulator am besten, um Funktionen für Aufgabenwarteschlangen zu testen. In der Emulator Suite-Dokumentation erfahren Sie, wie Sie Ihre App für die Emulation von Task-Queue-Funktionen 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 Task-Queue-Funktion zum ersten Mal bereitstellen, erstellt die Befehlszeile eine Task-Queue in Cloud Tasks mit den Optionen „Ratenbegrenzung“ und „Wiederholen“, 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.

Aufgabenwarteschlangenfunktionen in die Warteschlange stellen

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 noch keine Erfahrung mit Admin SDKs haben, lesen Sie den Hilfeartikel Fügen Sie Firebase einem Server hinzu.

In einem typischen Ablauf erstellt Admin SDK eine neue Aufgabe, stellt sie in Cloud Tasks an 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: Im Beispielcode wird versucht, die Ausführung von Aufgaben zu verteilen, indem der n-ten Aufgabe eine Verzögerung von n Minuten zugewiesen wird. 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: Maximale Wartezeit, die Cloud Tasks für die Ausführung einer Aufgabe wählt. Bei Cloud Tasks wird die Aufgabe gemäß der Wiederholungskonfiguration der Warteschlange oder bis zu diesem Termin wiederholt. In diesem Beispiel ist die Warteschlange so konfiguriert, dass die Aufgabe bis zu fünfmal wiederholt wird. Die Aufgabe wird jedoch automatisch abgebrochen, wenn der gesamte Vorgang (einschließlich der Wiederholungsversuche) mehr als fünf Minuten dauert.

Fehlerbehebung

Cloud Tasks">Cloud Tasks-Protokollierung 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 deaktiviert, da sie potenziell eine große Menge an Logs für Ihr Projekt generieren können. 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

Möglicherweise werden PERMISSION DENIED-Fehler angezeigt, wenn Aufgaben in die Warteschlange gestellt werden oder Cloud Tasks versucht, die Funktionen der Aufgabenwarteschlange aufzurufen. Achten Sie darauf, dass Ihr Projekt die folgenden IAM-Bindungen hat:

  • Die Identität, mit der Aufgaben in Cloud Tasks eingereiht werden, 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 zum Einreihen von Aufgaben in Cloud Tasks verwendet wird, benötigt die Berechtigung zur Verwendung des Dienstkontos, das mit einer Aufgabe in Cloud Tasks verknüpft ist.

    Im Beispiel ist das das App Engine-Standarddienstkonto.

Eine Anleitung zum Hinzufügen des Standarddienstkontos von App Engine als Nutzer des Standarddienstkontos von App Engine finden Sie in der Google Cloud IAM-Dokumentation.

  • Die Identität, die zum Auslösen der Task-Queue-Funktion verwendet wird, 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