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

Neste tutorial, mostramos como criar e executar um fluxo de trabalho principal 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 principal processe dados em ramificações paralelas e reduz o tempo total de execução. O fluxo de trabalho principal 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 principal que invoca iterações paralelas de um fluxo de trabalho secundário

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 é par ou ímpar) para simular o sucesso ou a falha da execução do fluxo de trabalho.

Console

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

    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.

  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 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 que você criou anteriormente.

Criar e implantar o fluxo de trabalho principal

O fluxo de trabalho principal executa várias ramificações do fluxo de trabalho secundário usando um loop for paralelo.

  1. Copie o código-fonte da definição do fluxo de trabalho. Ela 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 principal aguarda e armazena o resultado de cada execução do fluxo de trabalho filho. Para mais informações, consulte Conector da API Execuções do Workflows 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 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.

    6. Clique em Próxima.

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

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

    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 principal 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 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 workflow-parent 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. Veja os resultados do fluxo de trabalho no painel Saída.

    Os resultados serão semelhantes aos seguintes, 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 seguintes, 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 ramificações paralelas e retorna um indicador de sucesso ou falha para cada execução do fluxo de trabalho filho.