Esegui un flusso di lavoro che esegue altri flussi di lavoro in parallelo


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

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

Flusso di lavoro principale che richiama iterazioni parallele di un flusso di lavoro secondario

Obiettivi

In questo tutorial, imparerai a:

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

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

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a 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. 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. Verify 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. Verify 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify 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 roles/workflows.invoker role to the service account.

      To grant the role, find the Select a role list, then select roles/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. Verify 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 roles/workflows.invoker role to the service account.

      To grant the role, find the Select a role list, then select roles/workflows.invoker.

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

Crea ed esegui il deployment di un flusso di lavoro secondario

Un workflow secondario può ricevere ed elaborare i dati di un workflow principale. Il flusso di lavoro secondario lo dimostra facendo quanto segue:

  • Riceve un numero intero come argomento
  • Si mette in pausa per 10 secondi per simulare l'elaborazione
  • Restituisce un indicatore (in base al fatto che l'intero sia un numero pari o dispari) per simulare l'esito positivo o negativo dell'esecuzione del flusso di lavoro

Console

  1. Nella Google Cloud console, vai alla pagina Workflows.

    Vai a Flussi di lavoro

  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 il service account che hai creato in precedenza.

  6. Fai clic su Avanti.

  7. Nell'editor del workflow, inserisci la seguente definizione per il workflow:

    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 workflow:

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

    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 workflow:

    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 del account di servizio che hai creato in precedenza.

Crea ed esegui il deployment del workflow principale

Il flusso di lavoro principale esegue più rami del flusso di lavoro secondario utilizzando un ciclo for parallelo.

  1. Copia il codice sorgente della definizione del workflow. È composto dalle seguenti parti:

    1. Una mappa viene utilizzata per archiviare i risultati delle esecuzioni del workflow secondario. 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. Un ciclo for viene eseguito in parallelo per richiamare il flusso di lavoro secondario. Per saperne di più, 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 secondario viene richiamato utilizzando un connettore. A ogni iterazione del flusso di lavoro secondario viene passato l'argomento iteration. Il flusso di lavoro principale attende e memorizza il risultato di ogni esecuzione del flusso di lavoro secondario. Per saperne di più, consulta Connettore API Workflows Executions e Argomenti di 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 ulteriori informazioni, vedi Completare l'esecuzione di un flusso di lavoro.

      - return_execution_results:
          return: ${execution_results}
  2. Esegui il deployment del workflow:

    Console

    1. Nella console Google Cloud , vai alla pagina Workflows:

      Vai a Flussi di lavoro

    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 il service account che hai creato in precedenza.

    6. Fai clic su 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 workflow:

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

    3. Esegui il deployment del workflow:

      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 del account di servizio che hai creato in precedenza.

Esegui il workflow principale

Esegui il workflow principale in modo che le chiamate al workflow secondario vengano eseguite in parallelo. L'esecuzione dovrebbe richiedere circa 10 secondi.

Console

  1. Nella console Google Cloud , vai alla pagina Workflows:

    Vai a Flussi di lavoro

  2. Nella pagina Flussi di lavoro, fai clic sul workflow workflow-parent per accedere alla relativa pagina dei dettagli.

  3. Nella pagina Dettagli workflow, fai clic su Esegui.

  4. Fai di nuovo clic su Esegui.

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

    I risultati dovrebbero essere simili ai seguenti, che indicano errori con le iterazioni 2 e 4 e successo 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 workflow:

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

I risultati dovrebbero essere simili ai seguenti, che indicano errori con le iterazioni 2 e 4 e successo 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 e implementato correttamente un flusso di lavoro che richiama un flusso di lavoro secondario, esegue quattro iterazioni del flusso di lavoro secondario in rami paralleli e restituisce un indicatore di esito positivo o negativo per ogni esecuzione del flusso di lavoro secondario.

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 creato per il tutorial.

Per eliminare il progetto:

  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.

Eliminare le risorse del tutorial

Elimina i flussi di lavoro creati in questo tutorial:

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

Passaggi successivi