Funktionen mit Cloud Tasks (1. Generation) in die Warteschlange stellen

Aufgabenwarteschlangenfunktionen nutzen Google Cloud Tasks , damit Ihre App zeitaufwendige, ressourcenintensive oder bandbreitenbeschränkte Aufgaben asynchron außerhalb des Hauptanwendungsablaufs ausführen kann.

Angenommen, Sie möchten Sicherungen einer großen Anzahl von Bild dateien erstellen, die derzeit auf einer API mit einer Ratenbegrenzung gehostet werden. Um diese API verantwortungsvoll zu nutzen, müssen Sie die Ratenbegrenzungen einhalten. Außerdem kann es bei dieser Art von lang andauernden Jobs aufgrund von Zeitüberschreitungen und Speicherlimits zu Fehlern kommen.

Um diese Komplexität zu verringern, können Sie eine Aufgabenwarteschlangenfunktion schreiben, die grundlegende Aufgabenoptionen 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 Überlastungskontrolle und Wiederholungsrichtlinien für diese Arten von Vorgängen zu gewährleisten.

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 Aufgabenwarteschlangenfunktionen mit Firebase kann zu Gebühren für die Cloud Tasks Verarbeitung führen. Weitere Informationen finden Sie unter Cloud Tasks Preise.

Aufgabenwarteschlangenfunktionen erstellen

So verwenden Sie Aufgabenwarteschlangenfunktionen:

  1. Schreiben Sie eine Aufgabenwarteschlangenfunktion mit dem Firebase SDK für Cloud Functions.
  2. Testen Sie die Funktion, indem Sie sie mit einer HTTP-Anfrage auslösen.
  3. Stellen Sie die Funktion mit der Firebase CLI bereit. Wenn Sie Ihre Aufgaben warteschlangenfunktion zum ersten Mal bereitstellen, erstellt die CLI eine Aufgabenwarteschlange in Cloud Tasks mit Optionen (Ratenbegrenzung und Wiederholung), die im Quellcode angegeben sind.
  4. Fügen Sie der neu erstellten Aufgabenwarteschlange Aufgaben hinzu und übergeben Sie bei Bedarf Parameter, um einen Ausführungszeitplan einzurichten. Dazu schreiben Sie den Code mit dem Admin SDK und stellen ihn in Cloud Functions for Firebase bereit.

Aufgabenwarteschlangenfunktionen schreiben

Verwenden Sie onDispatch um mit dem Schreiben von Aufgabenwarteschlangenfunktionen zu beginnen. Ein wichtiger Teil des Schreibens einer Aufgabenwarteschlangenfunktion ist die Konfiguration von Wiederholungsversuchen und Raten- begrenzungen pro Warteschlange. Die Codebeispiele auf dieser Seite basieren auf einer App, die einen Dienst einrichtet, der alle Bilder von „Astronomy Picture of the Day“ der NASA sichert:

Aufgabenwarteschlangenfunktionen 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ünf Mal wiederholt. So können Sie vorübergehende Fehler wie Netzwerk fehler oder vorübergehende Dienstunterbrechungen eines abhängigen externen Dienstes vermeiden.
  • retryConfig.minBackoffSeconds=60: Jede Aufgabe wird mindestens 60 Sekunden nach jedem Versuch wiederholt. So haben Sie zwischen den Versuchen einen großen Puffer damit die fünf Wiederholungsversuche nicht zu schnell aufgebraucht werden.
  • rateLimits.maxConcurrentDispatch=6: Es werden maximal sechs Aufgaben gleichzeitig gesendet. So wird ein stetiger Strom von Anfragen an die zugrunde liegende Funktion gewährleistet und die Anzahl der aktiven Instanzen und Kaltstarts reduziert.

Aufgabenwarteschlangenfunktionen testen

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

Außerdem 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

So stellen Sie Aufgabenwarteschlangenfunktionen mit der Firebase CLI bereit:

$ firebase deploy --only functions:backupApod

Wenn Sie eine Aufgabenwarteschlangenfunktion zum ersten Mal bereitstellen, erstellt die CLI eine Aufgabenwarteschlange in Cloud Tasks 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.

Aufgabenwarteschlangenfunktionen 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 das Admin SDK noch nicht kennen, lesen Sie den Artikel Firebase einem Server hinzufügen.

In einem typischen Ablauf erstellt das 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, indem er für die N-te Aufgabe eine Verzögerung von N Minuten festlegt. Das bedeutet, dass etwa eine Aufgabe pro Minute ausgelöst wird. Sie können auch scheduleTime verwenden, wenn Cloud Tasks eine Aufgabe zu einem bestimmten Zeitpunkt auslösen soll.
  • dispatchDeadlineSeconds: Maximale Zeit, die Cloud Tasks wartet auf den Abschluss einer Aufgabe. Cloud Tasks wiederholt die Aufgabe gemäß der Wiederholungsk0nfiguration der Warteschlange oder bis diese Frist erreicht ist. Im Beispiel ist die Warteschlange so konfiguriert, dass die Aufgabe bis zu fünf Mal wiederholt wird. Die Aufgabe wird jedoch automatisch abgebrochen, wenn der gesamte Vorgang (einschließlich Wiederholungsversuchen) länger als fünf Minuten dauert.

Fehlerbehebung

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 Aufgabenwarteschlangenfunktionen aktiv entwickeln und debuggen. Weitere Informationen finden Sie unter Protokollierung aktivieren.

IAM-Berechtigungen

Beim In-die-Warteschlange-Stellen von Aufgaben oder wenn Cloud Tasks versucht, Ihre Aufgabenwarteschlangenfunktionen aufzurufen, werden möglicherweise PERMISSION DENIED Fehler angezeigt. Prüfen Sie, ob Ihr Projekt die folgenden IAM-Bindungen hat:

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

    Im Beispiel ist dies 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 In-die-Warteschlange-Stellen 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 dies das App Engine Standarddienstkonto.

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

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

    Im Beispiel ist dies 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