本教學課程將說明如何建立 Cloud Tasks 佇列,以便控管工作流程執行的速度。
同時執行的有效工作流程數量上限。一旦這個配額用盡,如果執行作業延後已停用,或是已達延後執行作業的配額,則任何新執行作業都會失敗,並傳回 HTTP 429 Too many requests
狀態碼。只要啟用 Cloud Tasks 佇列,即可依您指定的速率執行子工作流程,避免工作流程配額相關問題,並提高執行率。
請注意,Cloud Tasks 旨在提供「至少一次」傳遞;不過,Workflows 無法確保 Cloud Tasks 的複製要求會精確地處理一次。
在下圖中,父項工作流程會叫用子項工作流程,而這些子項工作流程受到 Cloud Tasks 佇列的規範,且已套用調度率。
目標
教學課程內容:
- 建立 Cloud Tasks 佇列,做為父項和子項工作流程之間的中介。
- 建立及部署子工作流程,以便接收來自父項工作流程的資料。
- 建立及部署會透過 Cloud Tasks 佇列執行子工作流程的父項工作流程。
- 在不設定調度率限制的情況下執行父項工作流程,這會叫用子項工作流程的執行作業。
- 將調度限制套用至 Cloud Tasks 佇列,並執行父項工作流程。
- 請注意,子項工作流程會以透過 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.
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
主控台
-
Sign in to your Google Account.
If you don't already have one, sign up for a new account.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs.
- 在 Google Cloud 控制台中,前往「IAM」頁面,為 Compute Engine 預設服務帳戶設定權限。
請記下 Compute Engine 預設服務帳戶,因為您會將其與本教學課程中的工作流程建立關聯,以利測試。啟用或使用使用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,且電子郵件格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
將
PROJECT_NUMBER
替換為您的Google Cloud 專案編號。您可以在 Google Cloud 控制台的「歡迎」頁面中找到專案編號。 - 選取 Compute Engine 預設服務帳戶,然後在該列中按一下 「Edit principal」(編輯主體)。
- 在隨即顯示的對話方塊中,按一下
- 在「Select a role」(請選擇角色) 清單中,依序選取「Workflows」>「Workflows Invoker」,讓帳戶有權觸發工作流程執行作業。
- 在「Select a role」(請選擇角色) 清單中,依序選取「Cloud Tasks」>「Cloud Tasks Enqueuer」,讓帳戶有權建立工作。
「Add another role」(新增其他角色),然後新增下列角色:
- 按一下 [儲存]。
gcloud
-
Sign in to your Google Account.
If you don't already have one, sign up for a new account.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs:
gcloud services enable cloudtasks.googleapis.com<wbr> compute.googleapis.com<wbr> workflows.googleapis.com
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Tasks, Compute Engine, and Workflows APIs:
gcloud services enable cloudtasks.googleapis.com<wbr> compute.googleapis.com<wbr> workflows.googleapis.com
請記下 Compute Engine 預設服務帳戶,因為您會將其與本教學課程中的工作流程建立關聯,以利測試。啟用或使用使用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,且電子郵件格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
將
PROJECT_NUMBER
替換為您的Google Cloud 專案編號。您可以執行下列指令,找出專案編號:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- 將專案的 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 專案 IDPROJECT_NUMBER
: Google Cloud 專案編號
- 將專案的 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 佇列,並用於調節工作流程執行的頻率。
控制台
前往 Google Cloud 控制台的「Cloud Tasks」頁面:
按一下
「Create push queue」(建立發送佇列)。輸入「佇列名稱」
queue-workflow-child
。在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))。
按一下 [建立]。
gcloud
QUEUE=queue-workflow-child LOCATION=us-central1 gcloud tasks queues create $QUEUE --location=$LOCATION
建立及部署子工作流程
子工作流程可接收並處理來自父項工作流程的資料。建立及部署執行下列作業的子工作流程:
- 接收
iteration
做為引數 - 休眠 10 秒,模擬處理程序
在成功執行後傳回字串
控制台
前往 Google Cloud 控制台的「Workflows」頁面。
按一下「建立」。
輸入新工作流程的名稱
workflow-child
。在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))。
在「服務帳戶」清單中,選取「Compute Engine 預設服務帳戶」。
點按「Next」。
在工作流程編輯器中,輸入工作流程的定義:
按一下 [Deploy] (部署)。
gcloud
為工作流程建立原始碼檔案:
touch workflow-child.yaml
在文字編輯器中開啟來源程式碼檔案,然後將下列工作流程複製到檔案中。
部署工作流程:
gcloud workflows deploy workflow-child \ --source=workflow-child.yaml \ --location=us-central1 \ --service-account=
PROJECT_NUMBER
-compute@developer.gserviceaccount.com
建立及部署父項工作流程
父項工作流程會使用 for
迴圈執行子項工作流程的多個分支。
複製定義父項工作流程的原始碼:
工作流程包含以下部分:
用於指派參照子工作流程和 Cloud Tasks 佇列名稱的常數的對應表。詳情請參閱「地圖」。
執行
for
迴圈,以便以遞迴方式叫用子項工作流程。詳情請參閱「疊代」。工作流程步驟,可建立並新增大量工作至 Cloud Tasks 佇列,以便執行子工作流程。詳情請參閱 Cloud Tasks API 連接器。
部署工作流程:
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
按一下「建立」。
輸入新工作流程的名稱
workflow-parent
。在「Region」(區域) 清單中,選取「us-central1 (Iowa)」(us-central1 (愛荷華州))。
在「服務帳戶」清單中,選取「Compute Engine 預設服務帳戶」。
點按「Next」。
在工作流程編輯器中,貼上父項工作流程的定義。
按一下 [Deploy] (部署)。
gcloud
為工作流程建立原始碼檔案:
touch workflow-parent.yaml
在文字編輯器中開啟原始碼檔案,然後貼上父項工作流程的定義。
部署工作流程:
gcloud workflows deploy workflow-parent \ --source=workflow-parent.yaml \ --location=us-central1 \ --service-account=
PROJECT_NUMBER
-compute@developer.gserviceaccount.com
執行無速率限制的上層工作流程
執行父項工作流程,透過 Cloud Tasks 佇列叫用子項工作流程。執行作業應會在 10 秒內完成。
控制台
前往 Google Cloud 控制台的「Workflows」頁面:
在「Workflows」頁面中,按一下「workflow-parent」工作流程,前往其詳細資料頁面。
在「Workflow details」(工作流程詳細資料)頁面中,按一下 play_arrow「Execute」(執行)。
再次按一下「執行」。
在父項工作流程執行期間,返回「Workflows」頁面,然後按一下「workflow-child」工作流程,前往其詳細資料頁面。
按一下「執行」分頁標籤。
您應該會看到子工作流程的執行作業,大約在同一時間執行,如下所示:
gcloud
執行工作流程:
gcloud workflows run workflow-parent \ --location=us-central1
如要確認是否已觸發工作流程執行作業,請列出最近四次的執行作業:
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 佇列,然後執行父項工作流程。
控制台
前往 Google Cloud 控制台的「Cloud Tasks」頁面:
按一下「queue-workflow-child」(您建立的 Cloud Tasks 佇列),然後按一下「Edit queue」(編輯佇列)。
在「Rate limits for task dispatches」部分的「Max dispatches」欄位中,輸入 1。
按一下 [儲存]。
前往「Workflows」頁面:
按一下「workflow-parent」工作流程,前往其詳細資料頁面。
在「Workflow details」(工作流程詳細資料)頁面中,按一下 play_arrow「Execute」(執行)。
再次按一下「執行」。
在父項工作流程執行期間,返回「Workflows」頁面,然後按一下「workflow-child」工作流程,前往其詳細資料頁面。
按一下「執行」分頁標籤。
您應該會看到子工作流程的執行作業,以每秒一項要求的速度執行,如下所示:
gcloud
更新 Cloud Tasks 佇列,以便套用每秒發送一次調度作業的速率限制:
gcloud tasks queues update $QUEUE \ --max-dispatches-per-second=1 \ --location=us-central1
執行工作流程:
gcloud workflows run workflow-parent \ --location=us-central1
如要確認是否已觸發工作流程執行作業,請列出最近四次的執行作業:
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 個迭代。
清除所用資源
如果您是為了這個教學課程建立新專案,請刪除專案。如果您使用現有的專案,且希望保留該專案而不採用本教學課程中新增的變更,請刪除為教學課程建立的資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
刪除教學課程資源
刪除在本教學課程中建立的工作流程和 Cloud Tasks 資源:
控制台
如要刪除工作流程,請按照下列步驟操作:
前往 Google Cloud 控制台的「Workflows」頁面:
在工作流程清單中按一下工作流程,即可前往「Workflow details」頁面。
按一下
「Delete」(刪除)。輸入工作流程名稱,然後按一下「確認」。
如要刪除 Cloud Tasks 佇列,請按照下列步驟操作:
前往 Google Cloud 控制台的「Cloud Tasks」頁面:
選取要刪除的佇列名稱,然後按一下「Delete queue」。
確認上述動作。
gcloud
如要刪除工作流程,請執行下列指令:
gcloud workflows delete workflow-child gcloud workflows delete workflow-parent
如要刪除 Cloud Tasks 佇列,請執行下列指令:
gcloud tasks queues delete queue-workflow-child
後續步驟
- 如要進一步瞭解如何使用 Cloud Tasks 將工作流程排入佇列並以非同步方式執行,請參閱「使用 Cloud Tasks 將工作流程排入佇列」。
- 如要進一步瞭解 Workflows 語法,請參閱 Workflows 語法參考資料。