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

Aufgabenwarteschlangen-Funktionen nutzen Cloud Tasks von Google, 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 Bilddateien 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 ein solcher lang andauernder Job aufgrund von Zeitüberschreitungen und Speicherlimits fehlschlagen.

Um diese Komplexität zu reduzieren, 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 Art 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, um Funktionen für Aufgabenwarteschlangen zu unterstützen.

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

Aufgabenwarteschlangen-Funktionen erstellen

So verwenden Sie Aufgabenwarteschlangenfunktionen:

  1. Schreiben Sie eine Aufgabenwarteschlangenfunktion 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 die Funktion mit der Firebase-Befehlszeile bereit. Wenn Sie Ihre Aufgabenwarteschlangenfunktion zum ersten Mal bereitstellen, erstellt die Befehlszeile eine Aufgabenwarteschlange in Cloud Tasks mit den in Ihrem Quellcode angegebenen Optionen (Ratenbegrenzung und Wiederholung).
  4. Fügen Sie der neu erstellten Aufgabenwarteschlange Aufgaben hinzu und übergeben Sie bei Bedarf Parameter, um einen Ausführungszeitplan einzurichten. Dazu können Sie den Code mit dem Admin SDK schreiben und in Cloud Functions for Firebase bereitstellen.

Aufgabenwarteschlangen-Funktionen schreiben

Verwenden Sie onDispatch, um mit dem Schreiben von Funktionen für Aufgabenwarteschlangen zu beginnen. Ein wichtiger Teil beim Schreiben einer Aufgabenwarteschlangenfunktion ist das Festlegen der Konfiguration für Wiederholungsversuche und Ratenbegrenzung pro Warteschlange. Die Codebeispiele auf dieser Seite basieren auf einer Anwendung, die einen Dienst einrichtet, der alle Bilder des Astronomy Picture of the Day der NASA sichert:

Aufgabenwarteschlangen-Funktionen konfigurieren

Funktionen für Aufgabenwarteschlangen bieten eine Reihe von Konfigurationseinstellungen, mit denen Sie die 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 minimieren.
  • retryConfig.minBackoffSeconds=60: Jede Aufgabe wird mindestens 60 Sekunden nach dem vorherigen Versuch wiederholt. So entsteht ein großer Puffer zwischen den einzelnen Versuchen, damit die fünf Wiederholungsversuche nicht zu schnell aufgebraucht werden.
  • rateLimits.maxConcurrentDispatch=6: Es werden maximal 6 Aufgaben gleichzeitig gesendet. So wird ein konstanter Stream 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, Funktionen für 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 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-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

Aufgabenwarteschlangen-Funktionen bereitstellen

Stellen Sie die Aufgabenwarteschlangenfunktion mithilfe der Firebase CLI bereit:

$ firebase deploy --only functions:backupApod

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

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

Aufgabenwarteschlangen-Funktionen in die Warteschlange stellen

Aufgabenwarteschlangen-Funktionen 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 mit den Admin SDKs noch nicht vertraut sind, finden Sie unter Firebase zu einem Server hinzufügen Informationen zu den ersten Schritten.

In einem typischen Ablauf erstellt der Admin SDK eine neue Aufgabe, stellt sie in die Warteschlange in 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 für die n-te Aufgabe eine Verzögerung von n Minuten festgelegt 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 Zeit, die Cloud Tasks auf den Abschluss einer Aufgabe wartet. Cloud Tasks wiederholt die Aufgabe gemäß der Wiederholungskonfiguration der Warteschlange oder bis diese Frist erreicht ist. 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 Wiederholungsversuchen) länger als fünf Minuten dauert.

Fehlerbehebung

Cloud Tasks-Logging aktivieren

Logs von Cloud Tasks enthalten nützliche Diagnoseinformationen, z. B. den Status der Anfrage, die mit einer Aufgabe verknüpft ist. Standardmäßig sind Logs von Cloud Tasks deaktiviert, da sie in Ihrem Projekt potenziell eine große Menge an Logs generieren können. Wir empfehlen, die Debugging-Logs zu aktivieren, während Sie Ihre Aufgabenwarteschlangenfunktionen aktiv entwickeln und debuggen. Weitere Informationen finden Sie unter Logging aktivieren.

IAM-Berechtigungen

Beim Einreihen von Aufgaben oder wenn Cloud Tasks versucht, Ihre Aufgabenwarteschlangenfunktionen aufzurufen, können PERMISSION DENIED-Fehler auftreten. Prüfen Sie, ob Ihr Projekt die folgenden IAM-Bindungen hat:

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

    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 Einreihen von Aufgaben in Cloud Tasks verwendet wird, benötigt die Berechtigung, das mit einer Aufgabe in Cloud Tasks verknüpfte Dienstkonto zu verwenden.

    Im Beispiel ist dies das App Engine-Standarddienstkonto.

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, die zum Auslösen der Aufgabenwarteschlangenfunktion verwendet wird, benötigt die Berechtigung cloudfunctions.functions.invoke.

    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