使用 Cloud Tasks 佇列緩衝工作流程執行作業

本教學課程說明如何建立 Cloud Tasks 佇列,以控管工作流程的執行速率。

可同時執行的有效工作流程執行作業有數量上限。配額用盡後,如果停用執行作業積壓,或達到積壓執行作業的配額,任何新的執行作業都會失敗,並傳回 HTTP 429 Too many requests 狀態碼。啟用 Cloud Tasks 佇列,以您定義的速率執行子工作流程,即可避免工作流程配額相關問題,並提高執行率。

請注意,Cloud Tasks 的設計是提供「至少一次」的傳送;不過,Workflows 無法確保 Cloud Tasks 重複要求只會處理一次。

在下圖中,父項工作流程會叫用受 Cloud Tasks 佇列調控的子項工作流程,且該佇列已套用調度率。

父項工作流程透過 Cloud Tasks 佇列叫用子項工作流程的疊代

建立 Cloud Tasks 佇列

建立可在父項工作流程中使用的 Cloud Tasks 佇列,並藉此控管工作流程執行頻率。

控制台

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

    前往 Cloud Tasks

  2. 按一下 「建立發送佇列」

  3. 輸入「Queue name」(佇列名稱)queue-workflow-child

  4. 在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))

  5. 點選「建立」

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

建立及部署子工作流程

子工作流程可以接收及處理來自父項工作流程的資料。建立及部署子工作流程,執行下列作業:

  • 以引數形式接收 iteration
  • 休眠 10 秒,模擬部分處理作業
  • 成功執行時傳回字串

控制台

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

    前往「Workflows」頁面

  2. 按一下 「建立」

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

  4. 在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))

  5. 在「服務帳戶」清單中,選取「Compute Engine 預設服務帳戶」

  6. 點選「下一步」

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

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+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
        - return_message:
            return: ${"Hello world"+iteration}
  3. 部署工作流程:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

建立及部署上層工作流程

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

  1. 複製定義父項工作流程的原始碼:

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    工作流程包含下列部分:

    • 用於指派常數的地圖,這些常數會參照子工作流程和 Cloud Tasks 佇列名稱。詳情請參閱「地圖」。

    • 執行 for 迴圈,以反覆叫用子項工作流程。詳情請參閱「疊代」。

    • 工作流程步驟:建立大量工作並新增至 Cloud Tasks 佇列,以執行子工作流程。詳情請參閱 Cloud Tasks API 連接器

  2. 部署工作流程:

    控制台

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

      前往「Workflows」頁面

    2. 按一下 「建立」

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

    4. 在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))

    5. 在「服務帳戶」清單中,選取「Compute Engine 預設服務帳戶」

    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=PROJECT_NUMBER-compute@developer.gserviceaccount.com

執行沒有速率限制的上層工作流程

執行父項工作流程,透過 Cloud Tasks 佇列叫用子項工作流程。執行作業大約需要 10 秒。

控制台

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

    前往「Workflows」頁面

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

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

  4. 再次按一下「執行」

  5. 在父項工作流程執行期間,返回「Workflows」頁面,然後按一下「workflow-child」工作流程,前往詳細資料頁面。

  6. 按一下「執行」分頁標籤。

    您應該會看到子工作流程的執行作業,執行時間大致相同,如下所示:

    在同一時間執行的子工作流程詳細資料。

gcloud

  1. 執行工作流程:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. 如要確認是否已觸發工作流程執行作業,請列出最近四次的執行作業:

    gcloud workflows executions list workflow-child --limit=4

    由於執行次數 (100 次) 低於工作流程並行限制,結果應與下列類似。如果同時提交數千項執行作業,可能會發生配額問題。

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

您已建立並部署工作流程,該工作流程會叫用子工作流程的 100 次疊代。

執行設有頻率限制的上層工作流程

對 Cloud Tasks 佇列套用每秒一次的調度頻率限制,然後執行父項工作流程。

控制台

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

    前往 Cloud Tasks

  2. 按一下您建立的 Cloud Tasks 佇列「queue-workflow-child」,然後按一下「編輯佇列」

  3. 在「工作調度的頻率限制」部分,於「Max dispatches」(調度次數上限) 欄位輸入 1

  4. 按一下 [儲存]

  5. 前往「Workflows」頁面:

    前往「Workflows」頁面

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

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

  8. 再次按一下「執行」

  9. 在父項工作流程執行期間,返回「Workflows」頁面,然後按一下「workflow-child」工作流程,前往詳細資料頁面。

  10. 按一下「執行」分頁標籤。

    您應該會看到子工作流程的執行作業,每秒執行一個要求,類似於下列內容:

    每秒執行子工作流程的要求詳細資料。

gcloud

  1. 更新 Cloud Tasks 佇列,套用每秒一次的調度率限制:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. 執行工作流程:

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. 如要確認是否已觸發工作流程執行作業,請列出最近四次的執行作業:

    gcloud workflows executions list workflow-child --limit=4

    結果應類似於以下內容,每秒執行一個工作流程:

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

您已成功部署工作流程,以每秒一次的調度率,呼叫子工作流程 100 次。