Einen Workflow ausführen, der andere Workflows parallel ausführt


In dieser Anleitung erfahren Sie, wie Sie einen übergeordneten Workflow erstellen und ausführen, in dem mehrere untergeordnete Workflows parallel ausgeführt werden.

Im folgenden Diagramm werden vier parallele Ausführungen des untergeordneten Workflows aufgerufen. So kann der übergeordnete Workflow Daten in parallelen Verzweigungen verarbeiten und die Gesamtausführungszeit wird reduziert. Der übergeordnete Workflow wartet, bis alle untergeordneten Workflows abgeschlossen sind, bevor eine Zusammenfassung der erfolgreichen und fehlgeschlagenen Ausführungen zurückgegeben wird. So wird die Fehlererkennung vereinfacht.

Übergeordneter Workflow, der parallele Iterationen eines untergeordneten Workflows aufruft

Lernziele

In dieser Anleitung werden Sie:

  1. Erstellen und bereitstellen eines untergeordneten Workflows, der Daten von einem übergeordneten Workflow empfängt.
  2. Erstellen und bereitstellen Sie einen übergeordneten Workflow, der mehrere untergeordnete Workflows mithilfe einer parallelen for-Schleife ausführt.
  3. Führen Sie den übergeordneten Workflow aus, der parallele Ausführungen des untergeordneten Workflows aufruft.
  4. Die Ergebnisse aller erfolgreichen und fehlgeschlagenen Ausführungen von untergeordneten Workflows werden in einer Map gespeichert und zurückgegeben.

Sie können die folgenden Befehle in der Google Cloud Console oder über die Google Cloud CLI entweder 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.

Vorbereitung

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. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

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

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

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

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Workflow Executions and Workflows APIs:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  7. Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. Grant the roles/workflows.invoker IAM role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/workflows.invoker

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account
  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. 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.

  11. Make sure that billing is enabled for your Google Cloud project.

  12. Enable the Workflow Executions and Workflows APIs:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  13. Set up authentication:

    1. Create the service account:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Replace SERVICE_ACCOUNT_NAME with a name for the service account.

    2. Grant the roles/workflows.invoker IAM role to the service account:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/workflows.invoker

      Replace the following:

      • SERVICE_ACCOUNT_NAME: the name of the service account
      • PROJECT_ID: the project ID where you created the service account

Untergeordneten Workflow erstellen und bereitstellen

Ein untergeordneter Workflow kann Daten von einem übergeordneten Workflow empfangen und verarbeiten. Im untergeordneten Workflow wird dies so demonstriert:

  • Nimmt eine Ganzzahl als Argument entgegen
  • 10 Sekunden lang inaktiv, um eine gewisse Verarbeitung zu simulieren
  • Gibt einen Indikator zurück, der angibt, ob die Ganzzahl eine ungerade oder gerade Zahl ist, um den Erfolg oder Misserfolg der Workflowausführung zu simulieren.

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 aus.

  5. Wählen Sie das zuvor erstellte Dienstkonto aus.

  6. Klicken Sie auf Weiter.

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

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  8. Klicken Sie auf Bereitstellen.

gcloud

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

    touch workflow-child.yaml
  2. Öffnen Sie die 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
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  3. Stellen Sie den Workflow bereit:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Ersetzen Sie SERVICE_ACCOUNT_NAME durch den Namen des zuvor erstellten Dienstkontos.

Übergeordneten Workflow erstellen und bereitstellen

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

  1. Kopieren Sie den Quellcode für die Workflowdefinition. Sie besteht aus den folgenden Teilen:

    1. In einer Zuordnung werden die Ergebnisse der Ausführung der untergeordneten Workflows gespeichert. Weitere Informationen finden Sie unter Google Maps.

      main:
        steps:
          - init:
              assign:
                - execution_results: {} # results from each execution
                - execution_results.success: {} # successful executions saved under 'success' key
                - execution_results.failure: {} # failed executions saved under 'failure' key
    2. Eine for-Schleife wird parallel ausgeführt, um den untergeordneten Workflow aufzurufen. Weitere Informationen finden Sie unter Parallele Schritte und Iteration.

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. Der untergeordnete Workflow wird über einen Connector aufgerufen. Jede Iteration des untergeordneten Workflows erhält das Argument iteration. Der übergeordnete Workflow wartet auf das Ergebnis der Ausführung jedes untergeordneten Workflows und speichert es. Weitere Informationen finden Sie unter Workflows Executions API-Connector und Laufzeitargumente.

      try:
        steps:
          - execute_child_workflow:
              call: googleapis.workflowexecutions.v1.projects.locations.workflows.executions.run
              args:
                workflow_id: workflow-child
                #location: ...
                #project_id: ...
                argument:
                  iteration: ${iteration}
              result: execution_result
          - save_successful_execution:
              assign:
                - execution_results.success[string(iteration)]: ${execution_result}
      except:
          as: e
          steps:
            - save_failed_execution:
                assign:
                  - execution_results.failure[string(iteration)]: ${e}
    4. Die Ausführungsergebnisse werden zurückgegeben. Weitere Informationen finden Sie unter Ausführung eines Workflows abschließen.

      - return_execution_results:
          return: ${execution_results}
  2. Stellen Sie den Workflow bereit:

    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-parent“ für den neuen Workflow ein.

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

    5. Wählen Sie das zuvor erstellte Dienstkonto aus.

    6. Klicken Sie auf Weiter.

    7. Fügen Sie die Definition für den übergeordneten Workflow in den Workflow-Editor 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=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

      Ersetzen Sie SERVICE_ACCOUNT_NAME durch den Namen des Dienstkontos, das Sie zuvor erstellt haben.

Übergeordneten Workflow ausführen

Führen Sie den übergeordneten Workflow so aus, dass Aufrufe des untergeordneten Workflows parallel ausgeführt werden. Die Ausführung sollte etwa 10 Sekunden dauern.

Console

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

    Zur Seite "Workflows"

  2. Klicken Sie auf der Seite Workflows auf den Workflow workflow-parent, um die Seite mit den Details aufzurufen.

  3. Klicken Sie auf der Seite Workflow-Details auf Ausführen.

  4. Klicken Sie noch einmal auf Ausführen.

  5. Sehen Sie sich die Ergebnisse des Workflows im Bereich Ausgabe an.

    Die Ergebnisse sollten in etwa so aussehen, wobei Fehler bei den Iterationen 2 und 4 und ein Erfolg bei den Iterationen 1 und 3 angezeigt werden.

    "failure": {
      "2": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":2}",
          "duration": "10.157992541s",
          "endTime": "2023-07-11T13:13:13.028424329Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 2\"",
    ...
      "4": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":4}",
          "duration": "10.157929734s",
          "endTime": "2023-07-11T13:13:13.061289142Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 4\"",
    ...
    "success": {
      "1": "Hello world1",
      "3": "Hello world3"

gcloud

Führen Sie den Workflow aus:

gcloud workflows run workflow-parent \
    --location=us-central1

Die Ergebnisse sollten in etwa so aussehen, wobei Fehler bei den Iterationen 2 und 4 und ein Erfolg bei den Iterationen 1 und 3 angezeigt werden.

Waiting for execution [06c753e4-6947-4c62-ac0b-2a9d53fb1b8f] to complete...done.
argument: 'null'
duration: 14.065415004s
endTime: '2023-07-11T12:50:43.929023883Z'
name: projects/386837416586/locations/us-central1/workflows/workflow-parent/executions/06c753e4-6947-4c62-ac0b-2a9d53fb1b8f
result: '{"failure":{"2":{"message":"Execution failed or cancelled.","operation":{"argument":"{\"iteration\":2}","duration":"10.143718070s","endTime":"2023-07-11T12:50:40.673209821Z","error":{"context":"RuntimeError:
...
"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"success":{"1":"Hello world1","3":"Hello world3"}}'
startTime: '2023-07-11T12:50:29.863608879Z'
state: SUCCEEDED

Sie haben einen Workflow erstellt und bereitgestellt, der einen untergeordneten Workflow aufruft, vier Iterationen des untergeordneten Workflows in parallelen Verzweigungen ausführt und für jede Ausführung des untergeordneten Workflows einen Erfolg- oder Fehlerindikator zurückgibt.

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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Anleitungsressourcen löschen

Löschen Sie die in dieser Anleitung erstellten Workflows:

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

Nächste Schritte