Cloud Tasks-Warteschlange zum Zwischenspeichern von Workflowausführungen verwenden


In dieser Anleitung erfahren Sie, wie Sie eine Cloud Tasks-Warteschlange erstellen, mit der Sie die Rate der Workflowausführungen regulieren können.

Es gibt eine maximale Anzahl aktiver Workflowausführungen, die gleichzeitig ausgeführt werden können. Wenn das Limit erreicht ist, schlagen neue Ausführungen fehl und es wird der HTTP-Statuscode 429 Too many requests zurückgegeben. Wenn Sie eine Cloud Tasks-Warteschlange aktivieren, um untergeordnete Workflows mit einer von Ihnen definierten Rate auszuführen, können Sie kontingentbezogene Probleme für Workflows vermeiden und eine bessere Ausführungsrate erzielen.

Cloud Tasks ist darauf ausgelegt, „mindestens einmal“ zu liefern. Workflows gewährleistet jedoch nicht die genau einmalige Verarbeitung doppelter Anfragen von Cloud Tasks.

Im folgenden Diagramm ruft ein übergeordneter Workflow untergeordnete Workflows auf, die von einer Cloud Tasks-Warteschlange reguliert werden, auf die eine Weiterleitungsrate angewendet wird.

Übergeordneter Workflow, der Iterationen eines untergeordneten Workflows über die Cloud Tasks-Warteschlange aufruft

Lernziele

In dieser Anleitung werden Sie:

  1. Erstellen Sie eine Cloud Tasks-Warteschlange, die als Vermittler zwischen den übergeordneten und untergeordneten Workflows dient.
  2. Einen untergeordneten Workflow erstellen und bereitstellen, der Daten vom übergeordneten Workflow empfängt
  3. Erstellen Sie den übergeordneten Workflow, der den untergeordneten Workflow über die Cloud Tasks-Warteschlange ausführt, und stellen Sie ihn bereit.
  4. Führen Sie den übergeordneten Workflow ohne ein Limit für die Weiterleitungsrate aus, wodurch die Ausführung des untergeordneten Workflows ausgelöst wird.
  5. Wenden Sie ein Weiterleitungslimit auf die Cloud Tasks-Warteschlange an und führen Sie den übergeordneten Workflow aus.
  6. Beachten Sie, dass die untergeordneten Workflows mit der in der Cloud Tasks-Warteschlange definierten Geschwindigkeit ausgeführt werden.

Sie können die folgenden Befehle in der Google Cloud Console oder über die Google Cloud CLI in Ihrem Terminal oder in Cloud Shell ausführen.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Von Ihrer Organisation definierte Sicherheitsbeschränkungen verhindern möglicherweise, dass die folgenden Schritte ausgeführt werden. Informationen zur Fehlerbehebung finden Sie unter Anwendungen in einer eingeschränkten Google Cloud-Umgebung entwickeln.

Console

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Cloud Tasks, Compute Engine, and Workflows APIs aktivieren.

    Aktivieren Sie die APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  7. Cloud Tasks, Compute Engine, and Workflows APIs aktivieren.

    Aktivieren Sie die APIs

  8. Rufen Sie in der Google Cloud Console die Seite IAM auf, um Berechtigungen für das Compute Engine-Standarddienstkonto festzulegen.

    IAM aufrufen

    Notieren Sie sich das Compute Engine-Standarddienstkonto, da Sie es zu Testzwecken mit den Workflows in dieser Anleitung verknüpfen werden. Dieses Dienstkonto wird automatisch erstellt, nachdem Sie einen Google Cloud-Dienst aktiviert oder verwendet haben, der Compute Engine verwendet. Er hat das folgende E-Mail-Format:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Ersetzen Sie PROJECT_NUMBER durch die Nummer Ihres Google Cloud-Projekts. Sie finden Ihre Projektnummer in der Google Cloud Console auf der Willkommensseite.

    Für Produktionsumgebungen empfehlen wir dringend, ein neues Dienstkonto zu erstellen und ihm eine oder mehrere IAM-Rollen zuzuweisen, die die erforderlichen Mindestberechtigungen enthalten und dem Prinzip der geringsten Berechtigung folgen.

  9. Wählen Sie das Compute Engine-Standarddienstkonto aus und klicken Sie in dieser Zeile auf Hauptkonto bearbeiten.
  10. Klicken Sie im angezeigten Dialogfeld auf Weitere Rolle hinzufügen und fügen Sie die folgenden Rollen hinzu:
    1. Wählen Sie in der Liste Rolle auswählen die Option Workflows > Workflows-Aufrufer aus, damit das Konto die Berechtigung zum Auslösen der Workflowausführung hat.
    2. Wählen Sie in der Liste Rolle auswählen die Option Cloud Tasks > Cloud Tasks-Ersteller aus, damit das Konto die Berechtigung zum Erstellen von Aufgaben hat.
  11. Klicken Sie auf Speichern.

gcloud

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Installieren Sie die Google Cloud CLI.
  3. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  6. Aktivieren Sie die Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Installieren Sie die Google Cloud CLI.
  8. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  11. Aktivieren Sie die Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. Notieren Sie sich das Compute Engine-Standarddienstkonto, da Sie es zu Testzwecken mit den Workflows in dieser Anleitung verknüpfen werden. Dieses Dienstkonto wird automatisch erstellt, nachdem Sie einen Google Cloud-Dienst aktiviert oder verwendet haben, der Compute Engine verwendet. Er hat das folgende E-Mail-Format:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Ersetzen Sie PROJECT_NUMBER durch die Nummer Ihres Google Cloud-Projekts. Sie können Ihre Projektnummer ermitteln, indem Sie den folgenden Befehl ausführen:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    Für Produktionsumgebungen empfehlen wir dringend, ein neues Dienstkonto zu erstellen und ihm eine oder mehrere IAM-Rollen zuzuweisen, die die erforderlichen Mindestberechtigungen enthalten und dem Prinzip der geringsten Berechtigung folgen.

  13. Gewähren Sie dem Compute Engine-Standarddienstkonto die Rolle „Workflows-Aufrufer“ (roles/workflows.invoker) für das Projekt, damit das Konto die Berechtigung zum Auslösen der Workflowausführung hat.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die Google Cloud-Projekt-ID
    • PROJECT_NUMBER: die Google Cloud-Projektnummer

  14. Weisen Sie dem Compute Engine-Standarddienstkonto die Rolle „Cloud Tasks-Ersteller“ (roles/cloudtasks.enqueuer) für das Projekt zu, damit das Konto die Berechtigung zum Erstellen von Aufgaben hat.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudtasks.enqueuer

Cloud Tasks-Warteschlange erstellen

Erstellen Sie eine Cloud Tasks-Warteschlange, die Sie im übergeordneten Workflow verwenden und mit der Sie die Rate der Workflowausführungen regulieren können.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Tasks auf:

    Zu Cloud Tasks

  2. Klicken Sie auf Push-Warteschlange erstellen.

  3. Geben Sie den Namen der Warteschlange queue-workflow-child ein.

  4. Wählen Sie in der Liste Region die Option us-central1 (Iowa) aus.

  5. Klicken Sie auf Erstellen.

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

Untergeordneten Workflow erstellen und bereitstellen

Ein untergeordneter Workflow kann Daten aus einem übergeordneten Workflow empfangen und verarbeiten. Erstellen Sie einen untergeordneten Workflow und stellen Sie ihn bereit, der folgende Schritte ausführt:

  • Erhält ein iteration als Argument
  • 10 Sekunden inaktiv, um eine Verarbeitung zu simulieren
  • Gibt nach erfolgreicher Ausführung einen String zurück

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Klicken Sie auf  Erstellen.

  3. Geben Sie den Namen workflow-child für den neuen Workflow ein.

  4. Wählen Sie in der Liste Region die Option us-central1 (Iowa) aus.

  5. Wählen Sie in der Liste Dienstkonto das Compute Engine-Standarddienstkonto aus.

  6. Klicken Sie auf Weiter.

  7. Geben Sie im Workflow-Editor die folgende Definition für den Workflow ein:

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. Klicken Sie auf Bereitstellen.

gcloud

  1. Erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch workflow-child.yaml
    
  2. Öffnen Sie Ihre Quellcodedatei in einem Texteditor und kopieren Sie den folgenden Workflow in die Datei.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Stellen Sie den Workflow bereit:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

Übergeordneten Workflow erstellen und bereitstellen

Der übergeordnete Workflow führt mithilfe einer for-Schleife mehrere Zweige des untergeordneten Workflows aus.

  1. Kopieren Sie den Quellcode, der den übergeordneten Workflow definiert:

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    Der Workflow besteht aus folgenden Teilen:

    • Eine Zuordnung, mit der Konstanten zugewiesen werden, die sich auf den untergeordneten Workflow und den Cloud Tasks-Warteschlangennamen beziehen. Weitere Informationen finden Sie unter Maps.

    • Eine for-Schleife, die ausgeführt wird, um den untergeordneten Workflow iterativ aufzurufen. Weitere Informationen finden Sie unter Iterationen.

    • Ein Workflowschritt, bei dem eine große Anzahl von Aufgaben erstellt und der Cloud Tasks-Warteschlange hinzugefügt wird, um den untergeordneten Workflow auszuführen. Weitere Informationen finden Sie unter Cloud Tasks API-Connector.

  2. Stellen Sie den Workflow bereit:

    Console

    1. Rufen Sie in der Google Cloud Console die Seite Workflows auf:

      Zur Seite "Workflows"

    2. Klicken Sie auf  Erstellen.

    3. Geben Sie den Namen workflow-parent für den neuen Workflow ein.

    4. Wählen Sie in der Liste Region die Option us-central1 (Iowa) aus.

    5. Wählen Sie in der Liste Dienstkonto das Compute Engine-Standarddienstkonto aus.

    6. Klicken Sie auf Weiter.

    7. Fügen Sie im Workflow-Editor die Definition für den übergeordneten Workflow ein.

    8. Klicken Sie auf Bereitstellen.

    gcloud

    1. Erstellen Sie eine Quellcodedatei für Ihren Workflow:

      touch workflow-parent.yaml
      
    2. Öffnen Sie die Quellcodedatei in einem Texteditor und fügen Sie die Definition für den übergeordneten Workflow ein.

    3. Stellen Sie den Workflow bereit:

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
      

Übergeordneten Workflow ohne Ratenbegrenzungen ausführen

Führen Sie den übergeordneten Workflow aus, um die untergeordneten Workflows über die Cloud Tasks-Warteschlange aufzurufen. Die Ausführungen sollten etwa 10 Sekunden dauern.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Workflows auf:

    Zur Seite "Workflows"

  2. Klicken Sie auf der Seite Workflows auf den Workflow workflow-parent, um die zugehörige Detailseite aufzurufen.

  3. Klicken Sie auf der Seite Workflowdetails auf Ausführen.

  4. Klicken Sie noch einmal auf Ausführen.

  5. Wenn der übergeordnete Workflow ausgeführt wird, kehren Sie zur Seite Workflows zurück und klicken Sie auf den Workflow workflow-child, um die zugehörige Detailseite aufzurufen.

  6. Klicken Sie auf den Tab Ausführungen.

    Sie sollten etwa zur gleichen Zeit ausgeführte Ausführungen des untergeordneten Workflows sehen, etwa so:

    Details zu den Ausführungen untergeordneter Workflows, die etwa zur selben Zeit ausgeführt werden.

gcloud

  1. Führen Sie den Workflow aus:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Wenn Sie prüfen möchten, ob eine Workflowausführung ausgelöst wurde, listen Sie die letzten vier Ausführungen auf:

    gcloud workflows executions list workflow-child --limit=4

    Da die Anzahl der Ausführungen (100) unter dem Limit für die Nebenläufigkeit von Workflows liegt, sollten die Ergebnisse in etwa so aussehen. Kontingentprobleme können auftreten, wenn Sie Tausende von Ausführungen gleichzeitig senden.

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

Sie haben einen Workflow erstellt und bereitgestellt, der 100 Iterationen des untergeordneten Workflows aufruft.

Übergeordneten Workflow mit Ratenbegrenzungen ausführen

Wenden Sie ein Ratenlimit von einer Weiterleitung pro Sekunde für die Cloud Tasks-Warteschlange an und führen Sie dann den übergeordneten Workflow aus.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Tasks auf:

    Zu Cloud Tasks

  2. Klicken Sie auf die von Ihnen erstellte Cloud Tasks-Warteschlange queue-workflow-child und dann auf Warteschlange bearbeiten.

  3. Geben Sie im Abschnitt Ratenlimits für Aufgabenweiterleitungen im Feld Max. Weiterleitungen den Wert 1 ein.

  4. Klicken Sie auf Speichern.

  5. Rufen Sie die Seite Workflows auf:

    Zur Seite "Workflows"

  6. Klicken Sie auf den Workflow workflow-parent, um die zugehörige Detailseite aufzurufen.

  7. Klicken Sie auf der Seite Workflowdetails auf Ausführen.

  8. Klicken Sie noch einmal auf Ausführen.

  9. Wenn der übergeordnete Workflow ausgeführt wird, kehren Sie zur Seite Workflows zurück und klicken Sie auf den Workflow workflow-child, um die zugehörige Detailseite aufzurufen.

  10. Klicken Sie auf den Tab Ausführungen.

    Sie sollten Ausführungen des untergeordneten Workflows sehen, die mit einer Anfrage pro Sekunde ausgeführt werden. Beispiel:

    Details des untergeordneten Workflows, der bei einer Anfrage pro Sekunde ausgeführt wird.

gcloud

  1. Aktualisieren Sie die Cloud Tasks-Warteschlange, um eine Ratenbegrenzung von einer Weiterleitung pro Sekunde anzuwenden:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Führen Sie den Workflow aus:

    gcloud workflows run workflow-parent \
       --location=us-central1
    
  3. Wenn Sie prüfen möchten, ob eine Workflowausführung ausgelöst wurde, listen Sie die letzten vier Ausführungen auf:

    gcloud workflows executions list workflow-child --limit=4

    Die Ergebnisse sollten in etwa so aussehen, wobei pro Sekunde ein Workflow ausgeführt wird:

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

Sie haben erfolgreich einen Workflow bereitgestellt, der 100 Iterationen des untergeordneten Workflows mit einer Weiterleitungsrate von einer Ausführung pro Sekunde aufruft.

Bereinigen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Anleitungsressourcen löschen

Löschen Sie die in dieser Anleitung erstellten Workflows und Cloud Tasks-Ressourcen:

Console

  • So löschen Sie die Workflows:

    1. Rufen Sie in der Google Cloud Console die Seite Workflows auf:

      Zur Seite "Workflows"

    2. Klicken Sie in der Liste der Workflows auf einen Workflow, um die zugehörige Seite Workflowdetails aufzurufen.

    3. Klicken Sie auf Löschen.

    4. Geben Sie den Namen des Workflows ein und klicken Sie dann auf Bestätigen.

  • So löschen Sie die Cloud Tasks-Warteschlange:

    1. Rufen Sie in der Google Cloud Console die Seite Cloud Tasks auf:

      Zu Cloud Tasks

    2. Wählen Sie den Namen der Warteschlange aus, die Sie löschen möchten, und klicken Sie auf Warteschlange löschen.

    3. Bestätigen Sie die Aktion.

gcloud

  • Führen Sie die folgenden Befehle aus, um die Workflows zu löschen:

    gcloud workflows delete workflow-child
    gcloud workflows delete workflow-parent

  • Führen Sie den folgenden Befehl aus, um die Cloud Tasks-Warteschlange zu löschen:

    gcloud tasks queues delete queue-workflow-child
    

Nächste Schritte