Enqueue-Funktionen mit Cloud Tasks


Aufgabenwarteschlangenfunktionen nutzen Google Cloud Tasks , um Ihrer App dabei zu helfen, zeitaufwändige, ressourcenintensive oder bandbreitenbeschränkte Aufgaben asynchron außerhalb Ihres Hauptanwendungsablaufs auszuführen.

Stellen Sie sich beispielsweise vor, Sie möchten Backups einer großen Menge an Bilddateien erstellen, die derzeit auf einer API mit einer Ratenbegrenzung gehostet werden. Um ein verantwortungsbewusster Nutzer dieser API zu sein, müssen Sie deren Ratenbeschränkungen respektieren. Darüber hinaus kann es bei dieser Art von Langzeitjobs aufgrund von Zeitüberschreitungen und Speicherbeschränkungen 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 Art von Vorgängen sicherzustellen.

Das Firebase SDK für Cloud Functions für Firebase v3.20.1 und höher arbeitet mit Firebase Admin SDK v10.2.0 und höher zusammen, um Aufgabenwarteschlangenfunktionen zu unterstützen.

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

Erstellen Sie Aufgabenwarteschlangenfunktionen

Um Aufgabenwarteschlangenfunktionen zu verwenden, befolgen Sie diesen Workflow:

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

Aufgabenwarteschlangenfunktionen schreiben

Verwenden Sie onDispatch um mit dem Schreiben von Aufgabenwarteschlangenfunktionen zu beginnen. Ein wichtiger Teil beim Schreiben einer Aufgabenwarteschlangenfunktion ist das Festlegen der Wiederholungsversuche pro Warteschlange und der Ratenbegrenzungskonfiguration. Codebeispiele auf dieser Seite basieren auf einer App, die einen Dienst einrichtet, der alle Bilder des Astronomiebilds des Tages der NASA sichert:

Konfigurieren Sie Aufgabenwarteschlangenfunktionen

Aufgabenwarteschlangenfunktionen umfassen leistungsstarke Konfigurationseinstellungen zur präzisen Steuerung von Ratenbegrenzungen und Wiederholungsverhalten einer Aufgabenwarteschlange:

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. Dies trägt dazu bei, vorübergehende Fehler wie Netzwerkfehler oder vorübergehende Dienstunterbrechungen eines abhängigen externen Dienstes zu mildern.
  • retryConfig.minBackoffSeconds=60 : Jede Aufgabe wird im Abstand von mindestens 60 Sekunden nach jedem Versuch erneut ausgeführt. Dies sorgt für einen großen Puffer zwischen den einzelnen Versuchen, sodass wir die fünf Wiederholungsversuche nicht zu schnell erschöpfen.
  • rateLimits.maxConcurrentDispatch=6 : Höchstens 6 Aufgaben werden gleichzeitig versendet. Dies trägt dazu bei, einen stetigen Strom von Anfragen an die zugrunde liegende Funktion sicherzustellen und trägt dazu bei, die Anzahl aktiver Instanzen und Kaltstarts zu reduzieren.

Aufgabenwarteschlangenfunktionen testen

Aufgabenwarteschlangenfunktionen in der Firebase Local Emulator Suite werden 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

Stellen Sie Aufgabenwarteschlangenfunktionen bereit

Stellen Sie die Aufgabenwarteschlangenfunktion mithilfe 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 den in Ihrem Quellcode angegebenen Optionen (Ratenbegrenzung und Wiederholung).

Wenn beim Bereitstellen von Funktionen Berechtigungsfehler auftreten, stellen Sie sicher, dass dem Benutzer, der die Bereitstellungsbefehle ausführt, die entsprechenden IAM-Rollen zugewiesen sind.

Aufgabenwarteschlangenfunktionen in die Warteschlange stellen

Aufgabenwarteschlangenfunktionen können mithilfe des Firebase Admin SDK für Node.js aus einer vertrauenswürdigen Serverumgebung wie Cloud Functions für Firebase in Cloud Tasks eingereiht werden. Wenn Sie mit den Admin-SDKs noch nicht vertraut sind, finden Sie weitere Informationen unter Hinzufügen von Firebase zu einem Server .

In einem typischen Ablauf erstellt das Admin SDK eine neue Aufgabe, stellt sie in Cloud Tasks ein 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 der N-ten Aufgabe eine Verzögerung von N-ten Minuten zuordnet. Dies entspricht dem Auslösen von ca. 1 Aufgabe/Minute. Beachten Sie, dass Sie auch scheduleTime verwenden können, wenn Sie möchten, dass Cloud Tasks eine Aufgabe zu einem bestimmten Zeitpunkt auslöst.
  • dispatchDeadlineSeconds : Maximale Zeit, die Cloud Tasks auf den Abschluss einer Aufgabe wartet. Cloud Tasks wiederholt die Aufgabe nach der Wiederholungskonfiguration der Warteschlange oder bis diese Frist erreicht ist. Im Beispiel ist die Warteschlange so konfiguriert, dass sie die Aufgabe bis zu fünf Mal wiederholt. Die Aufgabe wird jedoch automatisch abgebrochen, wenn der gesamte Vorgang (einschließlich Wiederholungsversuchen) mehr als 5 Minuten dauert.

Fehlerbehebung

Aktivieren Sie die Cloud Tasks-Protokollierung

Protokolle von Cloud Tasks enthalten nützliche Diagnoseinformationen wie den Status der mit einer Aufgabe verknüpften Anfrage. Standardmäßig sind Protokolle von Cloud Tasks deaktiviert, da es potenziell eine große Menge an Protokollen für Ihr Projekt generieren kann. Wir empfehlen Ihnen, die Debug-Protokolle zu aktivieren, während Sie Ihre Aufgabenwarteschlangenfunktionen aktiv entwickeln und debuggen. Siehe Protokollierung aktivieren .

IAM-Berechtigungen

Beim Einreihen PERMISSION DENIED angezeigt. Stellen Sie sicher, dass Ihr Projekt über die folgenden IAM-Bindungen verfügt:

  • 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 zur Verwendung des Dienstkontos, das einer Aufgabe in Cloud Tasks zugeordnet ist.

    Im Beispiel ist dies das App Engine-Standarddienstkonto .

Anweisungen zum Hinzufügen des App Engine-Standarddienstkontos als Benutzer des App Engine-Standarddienstkontos finden Sie in der Dokumentation zu Google Cloud IAM .

  • 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