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


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

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

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

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

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

目標

教學課程內容:

  1. 建立 Cloud Tasks 佇列,做為父項和子項工作流程之間的中介。
  2. 建立及部署子工作流程,接收來自父項工作流程的資料。
  3. 建立及部署父項工作流程,透過 Cloud Tasks 佇列執行子項工作流程。
  4. 執行父項工作流程,不設調度速率限制,這會叫用子項工作流程的執行作業。
  5. 對 Cloud Tasks 佇列套用調度限制,並執行父項工作流程。
  6. 請注意,子項工作流程的執行速率是透過 Cloud Tasks 佇列定義。

您可以在 Google Cloud 控制台中執行下列指令,也可以在終端機或 Cloud Shell 中使用 Google Cloud CLI 執行。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

事前準備

貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。

主控台

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. 在 Google Cloud 控制台中,前往「IAM」IAM頁面,為 Compute Engine 預設服務帳戶設定權限。

    前往「身分與存取權管理」頁面

    記下 Compute Engine 預設服務帳戶,您會在測試時將其與本教學課程中的工作流程建立關聯。啟用或使用採用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,電子郵件地址格式如下:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER 替換為您的Google Cloud 專案編號。您可以在 Google Cloud 控制台的「歡迎」頁面找到專案編號。

    在正式環境中,我們強烈建議建立新的服務帳戶,並授予一或多個包含最低必要權限的 IAM 角色,同時遵循最低權限原則。

  9. 選取 Compute Engine 預設服務帳戶,然後按一下該列中的 「編輯主體」
  10. 在隨即顯示的對話方塊中,按一下 「Add another role」(新增其他角色),然後新增下列角色:
    1. 在「Select a role」(請選擇角色) 清單中,依序選取「Workflows」(工作流程) >「Workflows Invoker」(工作流程呼叫者),讓帳戶有權觸發工作流程執行作業。
    2. 在「Select a role」(請選擇角色) 清單中,依序選取「Cloud Tasks」>「Cloud Tasks Enqueuer」(Cloud Tasks 佇列者),讓帳戶有權建立工作。
  11. 按一下 [儲存]

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. 記下 Compute Engine 預設服務帳戶,您會在測試時將其與本教學課程中的工作流程建立關聯。啟用或使用採用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,電子郵件地址格式如下:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER 替換為您的Google Cloud 專案編號。您可以執行下列指令,找出專案編號:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    在正式環境中,我們強烈建議建立新的服務帳戶,並授予一或多個包含最低必要權限的 IAM 角色,同時遵循最低權限原則。

  9. 將專案的工作流程叫用者角色 (roles/workflows.invoker) 授予 Compute Engine 預設服務帳戶,讓該帳戶有權觸發工作流程執行作業。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker

    更改下列內容:

    • PROJECT_ID:專案 ID Google Cloud
    • PROJECT_NUMBER: Google Cloud 專案編號

  10. 在專案中,將 Cloud Tasks Enqueuer 角色 (roles/cloudtasks.enqueuer) 授予 Compute Engine 預設服務帳戶,讓該帳戶有權建立工作。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudtasks.enqueuer

建立 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 次。

清除所用資源

如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有專案,並想保留專案,但不要在本教學課程中新增的變更,請刪除為本教學課程建立的資源

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

如要刪除專案:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除教學課程資源

刪除在本教學課程中建立的工作流程和 Cloud Tasks 資源:

控制台

  • 如要刪除工作流程,請按照下列步驟操作:

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

      前往「Workflows」頁面

    2. 在工作流程清單中,按一下任一工作流程,即可前往「工作流程詳細資料」頁面。

    3. 按一下 「Delete」(刪除)

    4. 輸入工作流程名稱,然後按一下「確認」

  • 如要刪除 Cloud Tasks 佇列,請按照下列步驟操作:

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

      前往 Cloud Tasks

    2. 選取要刪除的佇列名稱,然後按一下「刪除佇列」

    3. 確認上述動作。

gcloud

  • 如要刪除工作流程,請執行下列指令:

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

  • 如要刪除 Cloud Tasks 佇列,請執行下列指令:

    gcloud tasks queues delete queue-workflow-child

後續步驟