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

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

No diagrama seguinte, são invocadas quatro execuções paralelas do fluxo de trabalho filho. Isto permite que o fluxo de trabalho principal processe dados em ramificações paralelas e reduz o tempo de execução geral. O fluxo de trabalho principal aguarda que todas as execuções do fluxo de trabalho secundário terminem antes de devolver um resumo das execuções bem-sucedidas e com falhas, simplificando a deteção de erros.

Fluxo de trabalho principal que invoca iterações paralelas de um fluxo de trabalho secundário

Crie e implemente um fluxo de trabalho secundário

Um fluxo de trabalho secundário pode receber e processar dados de um fluxo de trabalho principal. O fluxo de trabalho secundário demonstra isto fazendo o seguinte:

  • Recebe um número inteiro como argumento
  • Dorme durante 10 segundos para simular algum processamento
  • Devolve um indicador (com base no facto de o número inteiro ser par ou ímpar) para simular o êxito ou a falha da execução do fluxo de trabalho

Consola

  1. Na Google Cloud consola, aceda à página Fluxos de trabalho.

    Aceda a Fluxos de trabalho

  2. Clique em Criar.

  3. Introduza o nome, workflow-child, do novo fluxo de trabalho.

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

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

  6. Clicar em Seguinte.

  7. No editor de fluxos de trabalho, introduza a seguinte definição para o 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. Clique em Implementar.

gcloud

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

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

    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. Implemente 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 criou anteriormente.

Crie e implemente o fluxo de trabalho principal

O fluxo de trabalho principal executa vários ramos do fluxo de trabalho secundário através de um ciclo forparalelo.

  1. Copie o código-fonte da definição do fluxo de trabalho. É composto pelas seguintes partes:

    1. É usado um mapa para armazenar os resultados das execuções do fluxo de trabalho secundário. Para mais informações, consulte o artigo Mapas.

      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 ciclo for é executado em paralelo para invocar o fluxo de trabalho secundário. Para mais informações, consulte os artigos Passos paralelos 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 secundário é invocado através de 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 secundário. Para mais informações, consulte o conector da API Workflows Executions e os argumentos de tempo 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 devolvidos. Para mais informações, consulte o artigo Conclua a execução de um fluxo de trabalho.

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

    Consola

    1. Na Google Cloud consola, aceda à página Fluxos de trabalho:

      Aceda a Fluxos de trabalho

    2. Clique em Criar.

    3. Introduza o nome, workflow-parent, do novo fluxo de trabalho.

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

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

    6. Clicar em Seguinte.

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

    8. Clique em Implementar.

    gcloud

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

      touch workflow-parent.yaml
    2. Abra o ficheiro de código fonte num editor de texto e cole a definição do fluxo de trabalho principal.

    3. Implemente 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 criou anteriormente.

Execute o fluxo de trabalho principal

Execute o fluxo de trabalho principal para que as invocações do fluxo de trabalho secundário sejam executadas em paralelo. As execuções devem demorar cerca de 10 segundos a concluir.

Consola

  1. Na Google Cloud consola, aceda à página Fluxos de trabalho:

    Aceda a Fluxos de trabalho

  2. Na página Fluxos de trabalho, clique no fluxo de trabalho workflow-parent para aceder à respetiva página de detalhes.

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

  4. Clique novamente em Executar.

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

    Os resultados devem ser semelhantes aos seguintes, indicando erros com as iterações 2 e 4, e êxito com as 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 seguintes, indicando erros com as iterações 2 e 4, e êxito com as 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

Criou e implementou com êxito um fluxo de trabalho que invoca um fluxo de trabalho secundário, executa quatro iterações do fluxo de trabalho secundário em ramificações paralelas e devolve um indicador de êxito ou falha para cada execução do fluxo de trabalho secundário.