Eseguire un flusso di lavoro che esegua altri flussi di lavoro in parallelo


Questo tutorial mostra come creare ed eseguire un flusso di lavoro padre che esegue più flussi di lavoro figlio in parallelo.

Nel diagramma seguente sono richiamate quattro esecuzioni parallele del flusso di lavoro figlio. Ciò consente al flusso di lavoro padre di elaborare i dati in rami paralleli e riduce il tempo di esecuzione complessivo. Il flusso di lavoro padre attende il completamento di tutte le esecuzioni del flusso di lavoro figlio prima di restituire un riepilogo delle esecuzioni riuscite e non riuscite, semplificando il rilevamento degli errori.

Flusso di lavoro padre che richiama iterazioni parallele di un flusso di lavoro figlio

Obiettivi

In questo tutorial, imparerai a:

  1. Crea ed esegui il deployment di un flusso di lavoro figlio che riceve dati da un flusso di lavoro padre.
  2. Crea ed esegui il deployment di un flusso di lavoro padre che esegue più flussi di lavoro figlio utilizzando un loop for parallelo.
  3. Esegui il flusso di lavoro padre che richiama esecuzioni parallele del flusso di lavoro figlio.
  4. I risultati di tutte le esecuzioni dei flussi di lavoro figlio riuscite e non riuscite vengono archiviati e restituiti in una mappa.

Puoi eseguire i comandi seguenti nella console Google Cloud o utilizzando Google Cloud CLI nel terminale o in Cloud Shell.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, vedi Sviluppare applicazioni in un ambiente Google Cloud vincolato.

Console

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

    Go to project selector

  2. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  3. Abilita le API Workflow Executions and Workflows.

    Abilita le API

  4. 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. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

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

  4. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  5. Abilita le API Workflow Executions and Workflows.

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  6. 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

Crea ed esegui il deployment di un flusso di lavoro figlio

Un flusso di lavoro figlio può ricevere ed elaborare i dati da un flusso di lavoro padre. Il flusso di lavoro secondario lo dimostra procedendo nel seguente modo:

  • Riceve un numero intero come argomento
  • In pausa per 10 secondi per simulare un'elaborazione
  • Restituisce un indicatore (a seconda che il numero intero sia un numero pari o dispari) per simulare l'esito positivo o negativo dell'esecuzione del flusso di lavoro

Console

  1. Nella console Google Cloud, vai alla pagina Flussi di lavoro.

    Vai a Workflows

  2. Fai clic su Crea.

  3. Inserisci il nome workflow-child per il nuovo flusso di lavoro.

  4. Nell'elenco Regione, seleziona us-central1.

  5. Seleziona l'Account di servizio che hai creato in precedenza.

  6. Tocca Avanti.

  7. Nell'editor del flusso di lavoro, inserisci la definizione seguente per il flusso di lavoro:

    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. Fai clic su Esegui il deployment.

gcloud

  1. Crea un file di codice sorgente per il tuo flusso di lavoro:

    touch workflow-child.yaml
    
  2. Apri il file di codice sorgente in un editor di testo e copia nel file il seguente flusso di lavoro.

    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. Esegui il deployment del flusso di lavoro:

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

    Sostituisci SERVICE_ACCOUNT_NAME con il nome dell'account di servizio che hai creato in precedenza.

Crea ed esegui il deployment del flusso di lavoro padre

Il flusso di lavoro padre esegue più rami del flusso di lavoro figlio utilizzando un loop for parallelo.

  1. Copia il codice sorgente per la definizione del flusso di lavoro. È composto dai seguenti componenti:

    1. Viene utilizzata una mappa per archiviare i risultati delle esecuzioni dei flussi di lavoro figlio. Per ulteriori informazioni, consulta 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. Viene eseguito un loop for in parallelo per richiamare il flusso di lavoro figlio. Per maggiori informazioni, consulta Passaggi paralleli e Iterazione.

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. Il flusso di lavoro figlio viene richiamato utilizzando un connettore. A ogni iterazione del flusso di lavoro figlio viene passato l'argomento iteration. Il flusso di lavoro padre attende e archivia il risultato di ogni esecuzione del flusso di lavoro figlio. Per ulteriori informazioni, consulta Connettore API Workflows Executions e Argomenti runtime.

      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. Vengono restituiti i risultati dell'esecuzione. Per maggiori informazioni, consulta Completare l'esecuzione di un flusso di lavoro.

      - return_execution_results:
          return: ${execution_results}
  2. Esegui il deployment del flusso di lavoro:

    Console

    1. Nella console Google Cloud, vai alla pagina Flussi di lavoro:

      Vai a Workflows

    2. Fai clic su Crea.

    3. Inserisci il nome workflow-parent per il nuovo flusso di lavoro.

    4. Nell'elenco Regione, seleziona us-central1.

    5. Seleziona l'Account di servizio che hai creato in precedenza.

    6. Tocca Avanti.

    7. Nell'editor del flusso di lavoro, incolla la definizione del flusso di lavoro principale.

    8. Fai clic su Esegui il deployment.

    gcloud

    1. Crea un file di codice sorgente per il tuo flusso di lavoro:

      touch workflow-parent.yaml
      
    2. Apri il file di codice sorgente in un editor di testo e incolla la definizione del flusso di lavoro padre.

    3. Esegui il deployment del flusso di lavoro:

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

      Sostituisci SERVICE_ACCOUNT_NAME con il nome dell'account di servizio che hai creato in precedenza.

Esegui il flusso di lavoro padre

Esegui il flusso di lavoro padre in modo che le chiamate al flusso di lavoro figlio vengano eseguite in parallelo. Il completamento delle esecuzioni dovrebbe richiedere circa 10 secondi.

Console

  1. Nella console Google Cloud, vai alla pagina Flussi di lavoro:

    Vai a Workflows

  2. Nella pagina Flussi di lavoro, fai clic sul flusso di lavoro flusso di lavoro-padre per passare alla relativa pagina dei dettagli.

  3. Nella pagina Dettagli flusso di lavoro, fai clic su Esegui.

  4. Fai di nuovo clic su Execute (Esegui).

  5. Visualizza i risultati del flusso di lavoro nel riquadro Output.

    I risultati dovrebbero essere simili ai seguenti, indicando errori nelle iterazioni 2 e 4 e l'esito positivo con le iterazioni 1 e 3.

    "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

Esegui il flusso di lavoro:

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

I risultati dovrebbero essere simili ai seguenti, indicando errori nelle iterazioni 2 e 4 e l'esito positivo con le iterazioni 1 e 3.

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

Hai creato ed eseguito correttamente il deployment di un flusso di lavoro che richiama un flusso di lavoro figlio, esegue quattro iterazioni del flusso di lavoro figlio in rami paralleli e restituisce un indicatore di esito positivo o negativo per ogni esecuzione del flusso di lavoro figlio.

Esegui la pulizia

Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina risorse tutorial

Elimina i flussi di lavoro creati in questo tutorial:

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

Passaggi successivi