Executar um fluxo de trabalho que executa outros fluxos de trabalho em paralelo


Este tutorial mostra como criar e executar um fluxo de trabalho pai que executa vários fluxos de trabalho filhos em paralelo.

No diagrama a seguir, quatro execuções paralelas do fluxo de trabalho filho são invocadas. Isso permite que o fluxo de trabalho pai processe dados em filiais paralelas e reduz o tempo de execução geral. O fluxo de trabalho pai aguarda a conclusão de todas as execuções de fluxo de trabalho filho antes de retornar um resumo das execuções bem-sucedidas e com falha, simplificando a detecção de erros.

Fluxo de trabalho pai invocando iterações paralelas de um fluxo de trabalho filho

Objetivos

Neste tutorial, você aprenderá a:

  1. Crie e implante um fluxo de trabalho filho que receba dados de um fluxo de trabalho pai.
  2. Crie e implante um fluxo de trabalho pai que execute vários fluxos de trabalho filhos usando um loop for paralelo.
  3. Execute o fluxo de trabalho pai, que invoca execuções paralelas do fluxo de trabalho filho.
  4. Os resultados de todas as execuções de fluxos de trabalho filhos bem-sucedidas e com falha são armazenados e retornados em um mapa.

É possível executar os comandos a seguir no console do Google Cloud ou usando a Google Cloud CLI no terminal ou no Cloud Shell.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito do Google Cloud.

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

Criar e implantar um fluxo de trabalho filho

Um fluxo de trabalho filho pode receber e processar dados de um fluxo de trabalho pai. O fluxo de trabalho filho demonstra isso fazendo o seguinte:

  • Recebe um número inteiro como argumento
  • Coloca em suspensão por 10 segundos para simular algum processamento
  • Retorna um indicador (com base em se o número inteiro é ímpar ou par) para simular o sucesso ou a falha da execução do fluxo de trabalho.

Console

  1. No console do Google Cloud, abra a página Workflows.

    Acessar fluxos de trabalho

  2. Clique em Criar.

  3. Insira o nome workflow-child para o novo fluxo de trabalho.

  4. Na lista Região, selecione us-central1.

  5. Selecione a conta de serviço que você criou anteriormente.

  6. Clique em Próxima.

  7. No editor de fluxo de trabalho, insira a seguinte definição:

    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. Clique em Implantar.

gcloud

  1. Crie um arquivo de código-fonte para seu fluxo de trabalho:

    touch workflow-child.yaml
  2. Abra o arquivo de código-fonte em um editor de texto e copie o seguinte fluxo de trabalho para o arquivo.

    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. Implante o fluxo de trabalho:

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

    Substitua SERVICE_ACCOUNT_NAME pelo nome da conta de serviço que você criou anteriormente.

Criar e implantar o fluxo de trabalho pai

O fluxo de trabalho pai executa várias ramificações do fluxo de trabalho filho usando um loop for paralelo.

  1. Copie o código-fonte da definição do fluxo de trabalho. Ele consiste nas seguintes partes:

    1. Um mapa é usado para armazenar os resultados das execuções de fluxo de trabalho filho. Para mais informações, consulte 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. Um loop for é executado em paralelo para invocar o fluxo de trabalho filho. Para mais informações, consulte Etapas paralelas e Iteração.

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. O fluxo de trabalho filho é invocado usando um conector. Cada iteração do fluxo de trabalho filho recebe o argumento iteration. O fluxo de trabalho pai espera e armazena o resultado de cada execução de fluxo de trabalho filho. Para mais informações, consulte o conector da API Workflows Executions e os Argumentos de ambiente de execução.

      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. Os resultados da execução são retornados. Para mais informações, consulte Concluir a execução de um fluxo de trabalho.

      - return_execution_results:
          return: ${execution_results}
  2. Implante o fluxo de trabalho:

    Console

    1. No console do Google Cloud, acesse a página Fluxos de trabalho:

      Acessar fluxos de trabalho

    2. Clique em Criar.

    3. Insira o nome workflow-parent para o novo fluxo de trabalho.

    4. Na lista Região, selecione us-central1.

    5. Selecione a conta de serviço que você criou anteriormente.

    6. Clique em Próxima.

    7. No editor de fluxo de trabalho, cole a definição do fluxo de trabalho pai.

    8. Clique em Implantar.

    gcloud

    1. Crie um arquivo de código-fonte para seu fluxo de trabalho:

      touch workflow-parent.yaml
    2. Abra o arquivo de código-fonte em um editor de texto e cole a definição do fluxo de trabalho pai.

    3. Implante o fluxo de trabalho:

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

      Substitua SERVICE_ACCOUNT_NAME pelo nome da conta de serviço que você criou anteriormente.

Executar o fluxo de trabalho principal

Execute o fluxo de trabalho pai para que as invocações do fluxo de trabalho filho sejam executadas em paralelo. A execução leva cerca de 10 segundos para ser concluída.

Console

  1. No console do Google Cloud, acesse a página Fluxos de trabalho:

    Acessar fluxos de trabalho

  2. Na página Fluxos de trabalho, clique no fluxo de trabalho fluxo de trabalho pai para acessar a página de detalhes dele.

  3. Na página Detalhes do fluxo de trabalho, clique em Executar.

  4. Clique em Executar novamente.

  5. Confira os resultados do fluxo de trabalho no painel Saída.

    Os resultados devem ser semelhantes aos mostrados abaixo, indicando erros nas iterações 2 e 4 e sucesso nas iterações 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

Execute o fluxo de trabalho:

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

Os resultados devem ser semelhantes aos mostrados abaixo, indicando erros nas iterações 2 e 4 e sucesso nas iterações 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

Você criou e implantou um fluxo de trabalho que invoca um fluxo de trabalho filho, executa quatro iterações do fluxo de trabalho filho em filiais paralelas e retorna um indicador de sucesso ou falha para cada execução do fluxo de trabalho filho.

Limpar

Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.

Exclua o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto:

  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.

Excluir recursos do tutorial

Exclua os fluxos de trabalho criados neste tutorial:

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

A seguir