本教學課程說明如何建立 Cloud Tasks 佇列,以控管工作流程的執行速率。
可同時執行的有效工作流程執行作業有數量上限。配額用盡後,如果停用執行作業積壓,或達到積壓執行作業的配額,任何新的執行作業都會失敗,並傳回 HTTP 429 Too many requests
狀態碼。啟用 Cloud Tasks 佇列,以您定義的速率執行子工作流程,即可避免工作流程配額相關問題,並提高執行率。
請注意,Cloud Tasks 的設計是提供「至少一次」的傳送;不過,Workflows 無法確保 Cloud Tasks 重複要求只會處理一次。
在下圖中,父項工作流程會叫用受 Cloud Tasks 佇列調控的子項工作流程,且該佇列已套用調度率。
建立 Cloud Tasks 佇列
建立可在父項工作流程中使用的 Cloud Tasks 佇列,並藉此控管工作流程執行頻率。
控制台
前往 Google Cloud 控制台的「Cloud Tasks」頁面:
按一下
「建立發送佇列」。輸入「Queue name」(佇列名稱),
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 預設服務帳戶」。
點選「下一步」。
在工作流程編輯器中,輸入下列工作流程定義:
按一下 [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 預設服務帳戶」。
點選「下一步」。
在工作流程編輯器中,貼上父項工作流程的定義。
按一下 [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 工作流程,前往詳細資料頁面。
在「工作流程詳細資料」頁面中,按一下 play_arrow「執行」。
再次按一下「執行」。
在父項工作流程執行期間,返回「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 次疊代。
執行設有頻率限制的上層工作流程
對 Cloud Tasks 佇列套用每秒一次的調度頻率限制,然後執行父項工作流程。
控制台
前往 Google Cloud 控制台的「Cloud Tasks」頁面:
按一下您建立的 Cloud Tasks 佇列「queue-workflow-child」,然後按一下「編輯佇列」。
在「工作調度的頻率限制」部分,於「Max dispatches」(調度次數上限) 欄位輸入 1。
按一下 [儲存]。
前往「Workflows」頁面:
按一下「workflow-parent」工作流程,前往詳細資料頁面。
在「工作流程詳細資料」頁面中,按一下 play_arrow「執行」。
再次按一下「執行」。
在父項工作流程執行期間,返回「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 次。