使用 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。

費用

In this document, you use the following billable components of Google Cloud:

To generate a cost estimate based on your projected usage, use the pricing calculator. New Google Cloud users might be eligible for a free trial.

事前準備

貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 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. Make sure 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. Make sure 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」頁面,為 Compute Engine 預設服務帳戶設定權限。

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

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

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

    對於實際環境,我們強烈建議建立新的服務帳戶,並授予一或多個包含必要最低權限的 IAM 角色,並遵循最低權限原則。

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

gcloud

  1. Sign in to your Google Account.

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

  2. Install the Google Cloud CLI.

  3. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Make sure that billing is enabled for your Google Cloud project.

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

    gcloud services enable cloudtasks.googleapis.com<wbr>&nbsp;compute.googleapis.com<wbr>&nbsp;workflows.googleapis.com
  8. Install the Google Cloud CLI.

  9. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Cloud Tasks, Compute Engine, and Workflows APIs:

    gcloud services enable cloudtasks.googleapis.com<wbr>&nbsp;compute.googleapis.com<wbr>&nbsp;workflows.googleapis.com
  14. 請記下 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 角色,其中包含所需的最低權限,並遵循最低權限原則。

  15. 將專案的 Workflows 叫用者角色 (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: Google Cloud 專案 ID
    • PROJECT_NUMBER: Google Cloud 專案編號

  16. 將專案的 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. 按一下 「Create push queue」(建立發送佇列)

  3. 輸入「佇列名稱」 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. 點按「Next」

  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. 點按「Next」

    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. 在「Workflow details」(工作流程詳細資料)頁面中,按一下 「Execute」(執行)

  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 次的 workflow。

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

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

控制台

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

    前往 Cloud Tasks

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

  3. 在「Rate limits for task dispatches」部分的「Max dispatches」欄位中,輸入 1

  4. 按一下 [儲存]

  5. 前往「Workflows」頁面:

    前往「Workflows」頁面

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

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

  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. 在工作流程清單中按一下工作流程,即可前往「Workflow details」頁面。

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

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

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

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

      前往 Cloud Tasks

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

    3. 確認上述動作。

gcloud

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

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

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

    gcloud tasks queues delete queue-workflow-child

後續步驟