Funktionen mit Cloud Tasks in die Warteschlange stellen


Aufgabenwarteschlangenfunktionen nutzen Google Cloud Tasks, um zeitaufwendige, ressourcenintensive oder bandbreitenbeschränkte Aufgaben asynchron außerhalb des Hauptanwendungsablaufs auszuführen.

Angenommen, Sie möchten Sicherungen einer großen Anzahl von Bilddateien erstellen, die derzeit auf einer API mit Ratenbegrenzung gehostet werden. Als verantwortungsbewusster Nutzer dieser API müssen Sie die Ratenbegrenzungen einhalten. Außerdem kann es bei solchen Jobs, die lange ausgeführt werden, zu Fehlern aufgrund von Zeitüberschreitungen und Arbeitsspeicherlimits kommen.

Um diese Komplexität zu verringern, können Sie eine Task-Queue-Funktion schreiben, die grundlegende Task-Optionen wie scheduleTime und dispatchDeadline festlegt und die Funktion dann an eine Warteschlange in Cloud Tasks übergibt. Die Cloud Tasks-Umgebung wurde speziell entwickelt, um eine effektive Überlastungssteuerung und Wiederholungsrichtlinien für diese Art von Vorgängen zu gewährleisten.

Das Firebase SDK für Cloud Functions for Firebase v3.20.1 und höher ist mit Firebase Admin SDK v10.2.0 und höher kompatibel, um Funktionen für Aufgabenwarteschlangen zu unterstützen.

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

Funktionen für Aufgabenwarteschlangen erstellen

So verwenden Sie Task-Queue-Funktionen:

  1. Schreiben Sie eine Task-Queue-Funktion mit dem Firebase SDK für Cloud Functions.
  2. Testen Sie Ihre Funktion, indem Sie sie mit einer HTTP-Anfrage auslösen.
  3. Stellen Sie Ihre Funktion mit der Firebase-CLI bereit. Wenn Sie Ihre Task-Queue-Funktion zum ersten Mal bereitstellen, wird mit der CLI eine Task-Queue in Cloud Tasks mit den in Ihrem Quellcode angegebenen Optionen (Ratenbegrenzung und Wiederholung) erstellt.
  4. Fügen Sie der neu erstellten Aufgabenwarteschlange Aufgaben hinzu und übergeben Sie bei Bedarf Parameter, um einen Ausführungszeitplan festzulegen. Sie können dies erreichen, indem Sie den Code mit Admin SDK schreiben und in Cloud Functions for Firebase bereitstellen.

Aufgabenwarteschlangenfunktionen schreiben

Verwenden Sie onDispatch, um mit dem Schreiben von Aufgabenwarteschlangenfunktionen zu beginnen. Ein wichtiger Teil beim Schreiben einer Task-Queue-Funktion ist das Festlegen der Konfiguration für Wiederholungsversuche und Ratenbegrenzung pro Warteschlange. Die Codebeispiele auf dieser Seite basieren auf einer App, die einen Dienst einrichtet, mit dem alle Bilder von Astronomy Picture of the Day der NASA gesichert werden:

Funktionen der Aufgabenwarteschlange konfigurieren

Aufgabenwarteschlangenfunktionen bieten eine Reihe leistungsstarker Konfigurationseinstellungen, mit denen Sie Ratenbegrenzungen und das 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 vermeiden.
  • retryConfig.minBackoffSeconds=60: Jede Aufgabe wird mindestens 60 Sekunden nach jedem Versuch wiederholt. So wird ein großer Puffer zwischen den einzelnen Versuchen geschaffen, damit die fünf Wiederholungsversuche nicht zu schnell aufgebraucht werden.
  • rateLimits.maxConcurrentDispatch=6: Es werden maximal 6 Aufgaben gleichzeitig gesendet. So wird ein stetiger Strom von Anfragen an die zugrunde liegende Funktion sichergestellt und die Anzahl der aktiven Instanzen und Kaltstarts reduziert.

Aufgabenwarteschlangen-Funktionen testen

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

Außerdem werden Task-Warteschlangenfunktionen als einfache HTTP-Funktionen in Firebase Local Emulator Suite bereitgestellt. Sie können eine emulierte Aufgabenfunktion testen, indem Sie eine HTTP-POST-Anfrage mit einer JSON-Daten-Payload 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

Aufgabenwarteschlangenfunktion mit der Firebase CLI bereitstellen:

$ firebase deploy --only functions:backupApod

Wenn Sie eine Task-Queue-Funktion zum ersten Mal bereitstellen, wird mit der CLI eine Task-Queue in Cloud Tasks mit Optionen (Ratenbegrenzung und Wiederholung) erstellt, die in Ihrem 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 die Warteschlange stellen

Aufgabenwarteschlangenfunktionen können in Cloud Tasks aus einer vertrauenswürdigen Serverumgebung wie Cloud Functions for Firebase mit dem Firebase Admin SDK für Node.js in die Warteschlange gestellt werden. Wenn Sie noch nicht mit Admin SDK vertraut sind, lesen Sie den Artikel Firebase einem Server hinzufügen.

In einem typischen Ablauf erstellt Admin SDK eine neue Aufgabe, stellt sie in die Warteschlange von Cloud Tasks 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 einem bestimmten Zeitpunkt auslösen soll.
  • dispatchDeadlineSeconds: Maximale Wartezeit von Cloud Tasks bis zum Abschluss einer Aufgabe. Cloud Tasks wird die Aufgabe gemäß der Konfiguration für Wiederholungsversuche der Warteschlange oder bis zum Erreichen dieser Frist wiederholen. Im Beispiel wird 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 der Wiederholungsversuche) länger als fünf Minuten dauert.

Fehlerbehebung

Cloud Tasks-Protokollierung aktivieren

Logs aus 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 in Ihrem Projekt ein großes Logvolumen 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

PERMISSION DENIED-Fehler können beim Einreihen von Aufgaben oder beim Versuch von Cloud Tasks, Ihre Aufgabenwarteschlangenfunktionen aufzurufen, auftreten. 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 Standarddienstkonto App Engine.

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 einer Aufgabe in Cloud Tasks zugeordnet ist.

    Im Beispiel ist das das Standarddienstkonto App Engine.

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

  • Die Identität, mit der die Task Queue-Funktion ausgelöst wird, benötigt die Berechtigung cloudfunctions.functions.invoke.

    Im Beispiel ist das das Standarddienstkonto App Engine.

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