執行同時執行其他工作流程的工作流程

本教學課程說明如何建立及執行父項工作流程,並行執行多個子項工作流程。

在下圖中,系統會叫用四個並行執行的子工作流程。這樣一來,父項工作流程就能在平行分支中處理資料,縮短整體執行時間。父項工作流程會等待所有子項工作流程執行完畢,然後傳回成功和失敗執行的摘要,簡化任何錯誤偵測。

父項工作流程會叫用子項工作流程的平行疊代

建立及部署子工作流程

子工作流程可以接收及處理來自父項工作流程的資料。子工作流程會執行下列動作來示範這點:

  • 以整數做為引數
  • 休眠 10 秒,模擬部分處理作業
  • 傳回指標 (根據整數是奇數還是偶數),模擬工作流程執行成功或失敗

控制台

  1. 前往 Google Cloud 控制台的「Workflows」頁面。

    前往「Workflows」頁面

  2. 按一下 「建立」

  3. 輸入新工作流程的名稱 workflow-child

  4. 在「Region」(區域) 清單中選取「us-central1」

  5. 選取先前建立的「服務帳戶」

  6. 點選「下一步」

  7. 在工作流程編輯器中,輸入下列工作流程定義:

    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. 按一下 [Deploy] (部署)

gcloud

  1. 為工作流程建立原始碼檔案:

    touch workflow-child.yaml
  2. 在文字編輯器中開啟原始碼檔案,然後將下列工作流程複製到檔案中。

    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. 部署工作流程:

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

    SERVICE_ACCOUNT_NAME 換成您先前建立的服務帳戶名稱。

建立及部署上層工作流程

上層工作流程會使用平行 for 迴圈,執行子工作流程的多個分支。

  1. 複製工作流程定義的原始碼。其中包含下列部分:

    1. 地圖用於儲存子工作流程執行作業的結果。詳情請參閱「地圖」。

      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. 系統會並行執行 for 迴圈,叫用子項工作流程。詳情請參閱「平行步驟」和「疊代」。

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. 子工作流程是透過連接器叫用。子工作流程的每次疊代都會傳遞 iteration 引數。父項工作流程會等待並儲存每個子項工作流程的執行結果。詳情請參閱「Workflows Executions API 連接器」和「執行階段引數」。

      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. 系統會傳回執行結果。詳情請參閱「完成工作流程的執行作業」。

      - return_execution_results:
          return: ${execution_results}
  2. 部署工作流程:

    控制台

    1. 前往 Google Cloud 控制台的「Workflows」頁面:

      前往「Workflows」頁面

    2. 按一下 「建立」

    3. 輸入新工作流程的名稱 workflow-parent

    4. 在「Region」(區域) 清單中選取「us-central1」

    5. 選取先前建立的「服務帳戶」

    6. 點選「下一步」

    7. 在工作流程編輯器中,貼上父項工作流程的定義。

    8. 按一下 [Deploy] (部署)

    gcloud

    1. 為工作流程建立原始碼檔案:

      touch workflow-parent.yaml
    2. 在文字編輯器中開啟原始碼檔案,然後貼上父項工作流程的定義。

    3. 部署工作流程:

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

      SERVICE_ACCOUNT_NAME 改成您先前建立的服務帳戶名稱。

執行父項工作流程

執行父項工作流程,讓子項工作流程的呼叫作業平行執行。執行作業大約需要 10 秒。

控制台

  1. 前往 Google Cloud 控制台的「Workflows」頁面:

    前往「Workflows」頁面

  2. 在「Workflows」頁面中,按一下 workflow-parent 工作流程,前往詳細資料頁面。

  3. 在「工作流程詳細資料」頁面中,按一下 「執行」

  4. 再次按一下「執行」

  5. 在「輸出」窗格中查看工作流程結果。

    結果應類似於以下內容,指出第 2 和第 4 次疊代發生錯誤,第 1 和第 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

執行工作流程:

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

結果應類似於以下內容,指出第 2 和第 4 次疊代發生錯誤,第 1 和第 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

您已成功建立及部署工作流程,該工作流程會叫用子項工作流程、在平行分支中執行四次子項工作流程,並傳回每次執行子項工作流程的成功或失敗指標。