Executar um fluxo de trabalho que executa outros em paralelo


Neste tutorial, mostramos 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 ramificações paralelas e reduz o tempo geral de execução. O fluxo de trabalho pai aguarda a conclusão de todas as execuções do fluxo de trabalho filho antes de retornar um resumo das execuções bem-sucedidas e com falha, simplificando qualquer detecção de erros.

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

Objetivos

Neste tutorial, você aprenderá a:

  1. Criar e implantar um fluxo de trabalho filho que recebe dados de um fluxo pai.
  2. Criar e implantar um fluxo de trabalho pai que execute vários fluxos de trabalho filhos usando uma repetição for paralela.
  3. executar o fluxo de trabalho pai, que invoca execuções paralelas do filho.
  4. Os resultados de todas as execuções bem-sucedidas e com falha do fluxo de trabalho filho 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 seu 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. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se agora.

  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Workflow Executions and Workflows.

    Ative as APIs

  5. Crie uma conta de serviço:

    1. No Console do Google Cloud, acesse a página Criar conta de serviço.

      Acesse "Criar conta de serviço"
    2. Selecione o projeto.
    3. No campo Nome da conta de serviço, insira um nome. O Console do Google Cloud preenche o campo ID da conta de serviço com base nesse nome.

      No campo Descrição da conta de serviço, insira uma descrição. Por exemplo, Service account for quickstart.

    4. Clique em Criar e continuar.
    5. Conceda o papel Workflows > Workflows Invoker à conta de serviço do.

      Para conceder o papel, encontre a lista Selecionar um papel e clique em Workflows > Workflows Invoker.

    6. Clique em Continuar.
    7. Clique em Concluído para terminar a criação da conta de serviço.

  6. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  7. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  8. Ative as APIs Workflow Executions and Workflows.

    Ative as APIs

  9. Crie uma conta de serviço:

    1. No Console do Google Cloud, acesse a página Criar conta de serviço.

      Acesse "Criar conta de serviço"
    2. Selecione o projeto.
    3. No campo Nome da conta de serviço, insira um nome. O Console do Google Cloud preenche o campo ID da conta de serviço com base nesse nome.

      No campo Descrição da conta de serviço, insira uma descrição. Por exemplo, Service account for quickstart.

    4. Clique em Criar e continuar.
    5. Conceda o papel Workflows > Workflows Invoker à conta de serviço do.

      Para conceder o papel, encontre a lista Selecionar um papel e clique em Workflows > Workflows Invoker.

    6. Clique em Continuar.
    7. Clique em Concluído para terminar a criação da conta de serviço.

gcloud

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se agora.

  2. Instale a CLI do Google Cloud.
  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Ative as APIs Workflow Executions and Workflows:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  7. Configure a autenticação:

    1. Crie a conta de serviço:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Substitua SERVICE_ACCOUNT_NAME por um nome para a conta de serviço.

    2. Conceda o papel do IAM roles/workflows.invoker à conta de serviço:

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

      Substitua:

      • SERVICE_ACCOUNT_NAME: o nome da conta de serviço.
      • PROJECT_ID: o ID do projeto em que você criou a conta de serviço
  8. Instale a CLI do Google Cloud.
  9. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  10. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  11. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  12. Ative as APIs Workflow Executions and Workflows:

    gcloud services enable workflowexecutions.googleapis.com workflows.googleapis.com
  13. Configure a autenticação:

    1. Crie a conta de serviço:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Substitua SERVICE_ACCOUNT_NAME por um nome para a conta de serviço.

    2. Conceda o papel do IAM roles/workflows.invoker à conta de serviço:

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

      Substitua:

      • SERVICE_ACCOUNT_NAME: o nome da conta de serviço.
      • PROJECT_ID: o ID do projeto em que você criou a conta de serviço

Criar e implantar um fluxo de trabalho filho

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

  • Recebe um número inteiro como argumento
  • Suspende por 10 segundos para simular algum processamento
  • Retorna um indicador (com base em um número í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 para seu fluxo de trabalho:

    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. Selecione 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 fluxo de trabalho a seguir 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 criada anteriormente.

Criar e implantar o fluxo de trabalho pai

O fluxo de trabalho pai executa várias ramificações do filho usando uma repetição for paralela.

  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 do 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. Uma repetição for é executada 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 aguarda e armazena o resultado de cada execução de fluxo de trabalho filho. Para mais informações, consulte Conector da API Workflows Executions e 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. Selecione 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 para o 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 criada anteriormente.

Executar o fluxo de trabalho pai

Execute o fluxo de trabalho pai para que as invocações do fluxo de trabalho filho sejam executadas em paralelo. As execuções levam cerca de 10 segundos para serem concluídas.

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 pai para acessar a página de detalhes.

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

  4. Clique em Executar novamente.

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

    Os resultados serão semelhantes aos mostrados a seguir, 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 serão semelhantes aos mostrados a seguir, 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 com sucesso um fluxo de trabalho que invoca um fluxo de trabalho filho, executa quatro iterações do fluxo de trabalho filho em ramificações paralelas e retorna um indicador de sucesso ou falha para cada execução de 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. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos do tutorial

Exclua os fluxos de trabalho criados neste tutorial:

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

A seguir