使用 Cloud Tasks 緩衝 HTTP 要求

1. 簡介

c6ac6ed05292f13e.png

Cloud Tasks 是一項全代管的佇列服務,可管理大量工作的執行、調度和傳送作業。

Cloud Tasks 可讓您區隔工作項目,稱為「工作」,這些工作可在主要應用程式流程之外獨立執行 (例如更新資料庫項目的工作),並使用您建立的處理常式以非同步方式將工作傳送至工作進行處理。

卸載的工作會新增至「佇列」,佇列會繼續保留,直到工作成功或失敗為止。根據設定,佇列也可以做為分派流量控制。您可以建立並設定佇列,然後由 Cloud Tasks 服務代管。工作新增完成後,佇列就會分派工作,並確保工作站可穩定地處理工作。

d59ffe8d34138c88.png

Cloud Tasks 的主要功能包括:

  • HTTP 目標:運用業界標準 OAuth/OIDC 驗證,以安全的方式新增工作,並以 Compute Engine、Google Kubernetes Engine、Cloud Run、Cloud Functions 或地端部署系統中執行的任何 HTTP 服務為目標。
  • 簡化工作:重複新增的工作只會調度一次。
  • 保證交付:工作保證至少執行一次,且大多數工作正好只傳送一次。
  • 頻率和重試控制選項:設定調度工作的頻率、嘗試次數上限、在下次嘗試之前須至少等待多長時間,藉此控管執行作業。
  • 未來排程:控制工作的執行時間。

在本程式碼研究室中,您要先瞭解如何建立及使用一般 Cloud Tasks 佇列來處理 HTTP 目標工作。接著,您將瞭解如何使用佇列層級 HTTP URI 覆寫功能和新的 BufferTask API,透過 Cloud Tasks 更輕鬆地緩衝 HTTP 要求。

課程內容

  • 如何建立 HTTP 目標工作。
  • 如何使用新的佇列層級 HTTP URI 覆寫功能建立 HTTP 目標工作。
  • 如何使用新的佇列層級 HTTP URI 覆寫來變更待處理工作。
  • 如何使用新的 BufferTask API 更輕鬆地緩衝 HTTP 要求。

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。

3. 為 HTTP 目標工作建立一般佇列

在第一個步驟中,您將瞭解如何建立一般 Cloud Tasks 佇列,以及如何為佇列新增 HTTP 工作,以便指定 Cloud Run 服務。

d4f09a342c8eab.png

什麼是 HTTP 目標工作?

HTTP 目標工作可透過業界標準 OAuth/OIDC 驗證,以安全的方式鎖定 Compute Engine、Google Kubernetes Engine、Cloud Run、Cloud Functions 或內部部署系統中運作的任何 HTTP 服務。

部署 Cloud Run 服務

首先,請確認必要的 API 已啟用:

gcloud services enable \
  cloudtasks.googleapis.com \
  run.googleapis.com

部署 Cloud Run 服務做為 HTTP 工作的目標:

SERVICE1=hello1
REGION=us-central1

gcloud run deploy $SERVICE1 \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

建立 Cloud Tasks 佇列

建立一般 Cloud Tasks 佇列:

QUEUE1=http-queue
LOCATION=us-central1

gcloud tasks queues create $QUEUE1 --location=$LOCATION

暫時暫停佇列,以便在建立 HTTP 工作時觀察這些工作:

gcloud tasks queues pause $QUEUE1 --location=$LOCATION

4. 建立及測試 HTTP 工作

在這個步驟中,您將建立 HTTP 工作,以鎖定先前建立的佇列。

建立 HTTP 工作

您可以使用 gcloud 建立 HTTP 工作:

gcloud tasks create-http-task \
    --queue=$QUEUE1 \
    --location=$LOCATION \
    --url=$SERVICE1_URL \
    --method=GET

選用步驟:您也可以透過用戶端程式庫建立 HTTP 工作。舉例來說,您可以查看 Program.cs,取得 C# 範例,其中 HTTP 要求會納入 TaskTaskRequest,然後才透過 CloudTasksClient 傳送至 Cloud Tasks:

var taskRequest = new CreateTaskRequest
{
    Parent = new QueueName(projectId, location, queue).ToString(),
    Task = new Task
    {
        HttpRequest = new HttpRequest
        {
            HttpMethod = HttpMethod.Get,
            Url = url
        }
    }
};

var client = CloudTasksClient.Create();
var response = client.CreateTask(taskRequest);

您可以按照下列步驟執行,來建立工作並新增到佇列中:

dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL

測試 HTTP 工作

此時,系統會建立工作,但尚未執行,因為佇列已暫停。您可以列出佇列來進行驗證:

gcloud tasks queues list --location=$LOCATION

您應該會在 PAUSED 狀態中看到佇列:

QUEUE_NAME  STATE
http-queue  PAUSED

恢復佇列:

gcloud tasks queues resume $QUEUE --location=$LOCATION

查看 Cloud Run 服務的記錄檔:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1

您應該會看到 Cloud Run 服務收到來自 Cloud Tasks 的 HTTP GET 要求:

httpRequest:
  latency: 0.227597158s
  protocol: HTTP/1.1
  remoteIp: 35.243.23.192
  requestMethod: GET
  requestSize: '415'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.32.53
  status: 200
  userAgent: Google-Cloud-Tasks

5. 建立包含轉送設定的佇列

在這個步驟中,您將學習如何使用轉送設定建立 Cloud Tasks 佇列,以使用佇列層級工作轉送設定功能新增 HTTP URI 覆寫設定。然後新增 HTTP 工作以指定第一個 Cloud Run 服務。您會發現轉送設定會覆寫 URI,將工作轉送至第二個 Cloud Run 服務。

5d1ec61a933f77.png

什麼是佇列層級工作轉送設定?

佇列層級工作轉送設定會變更整個佇列中所有待處理和新工作的 HTTP 工作轉送設定。這可以簡化工作建立程序,因為您不需要在工作層級設定 HTTP 目標,服務提供者也能設定佇列中所有工作的目標 (例如在原始後端停止運作時,將流量轉送至其他後端)。

以下設定可在佇列層級進行:

  • 標頭:在佇列層級指定時,佇列層級的標頭會對佇列中的所有工作更新/插入標頭。
  • HTTP 方法:指定佇列層級指定的 HTTP 方法,會覆寫佇列中所有工作的 HTTP 方法。
  • 目標 URI:您可以個別覆寫主機、路徑、查詢、通訊埠、配置 (HTTP 或 HTTPS)。
  • Authorization:在佇列層級指定的 OIDC/OAuth 設定,會覆寫工作層級的 OIDC/OAuth 設定。

部署第二項 Cloud Run 服務

部署第二個 Cloud Run 服務,做為稍後的 HTTP URI 覆寫目標:

SERVICE2=hello2
REGION=us-central1

gcloud run deploy $SERVICE2 \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

儲存服務網址主機供日後使用:

SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)')
SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')

建立含有轉送設定的 Cloud Tasks 佇列

透過 HTTP URI 覆寫功能建立佇列,並將轉送設定設為第二個 Cloud Run 服務。

QUEUE2=http-queue-uri-override

gcloud beta tasks queues create $QUEUE2 \
  --http-uri-override=host:$SERVICE2_HOST \
  --location=$LOCATION

請注意,URI 覆寫值是指第二個 Cloud Run 服務。任何新增至佇列的 HTTP 工作都會遭到覆寫原本的 URI 主機。您可以查看佇列設定:

gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION

您應該會看到 httpTarget 具有指向第二服務主機的 uriOverride

httpTarget:
  uriOverride:
    host: hello2-idcwffc3yq-uc.a.run.app
    pathOverride: {}
    queryOverride: {}
...

暫時暫停佇列,以便在建立 HTTP 工作時觀察這些工作:

gcloud tasks queues pause $QUEUE2 --location=$LOCATION

6. 使用轉送設定,為佇列建立及測試 HTTP 工作

在這個步驟中,您將建立 HTTP 工作以指定第一個服務,並觀察佇列已覆寫其 URI 以指向第二個服務。

建立 HTTP 工作

使用第一項服務的網址建立 HTTP 工作:

gcloud tasks create-http-task \
    --queue=$QUEUE2 \
    --location=$LOCATION \
    --url=$SERVICE1_URL \
    --method=GET

測試 HTTP 工作

恢復佇列:

gcloud tasks queues resume $QUEUE2 --location=$LOCATION

您應該會看到第二項 (非第一個) Cloud Run 服務收到來自 Cloud Tasks 的 HTTP GET 要求,因為遭到覆寫:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
---
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

7. 透過轉送設定變更待處理工作

您也可以使用轉送設定來變更佇列中所有待處理工作的 HTTP URI。如果後端服務停止運作,而您想快速轉送至其他服務時,這個選項就能派上用場。一起來看看這個步驟的運作方式。

再次暫停佇列:

gcloud tasks queues pause $QUEUE2 --location=$LOCATION

建立 HTTP 工作,並將 google.com 做為工作網址:

gcloud tasks create-http-task \
    --queue=$QUEUE2 \
    --location=$LOCATION \
    --url=https://www.google.com \
    --method=GET

佇列已暫停,工作因此處於待處理狀態。

現在,請更新 HTTP URI 覆寫,以指向第一項服務。這項操作會將待處理工作的主機從 google.com 覆寫到第一個服務的主機:

SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)')
SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g')

gcloud beta tasks queues update $QUEUE2 \
  --http-uri-override=host:$SERVICE1_HOST \
  --location=$LOCATION

恢復佇列:

gcloud tasks queues resume $QUEUE2 --location=$LOCATION

您應該會看到第一個 Cloud Run 服務因為覆寫值 (而非 google.com) 而收到來自 Cloud Tasks 的 HTTP GET 要求:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
---
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

8. 建立 BufferTask API 的佇列

一般而言,您可以使用 Tasks API 透過 gcloud 或 Tasks 用戶端程式庫建立工作。這會增加應用程式透過用戶端程式庫將 HTTP 要求包裝進 Tasks 的應用程式,也會在應用程式與 Tasks 用戶端程式庫之間建立依附元件。

在這個步驟中,您將瞭解如何利用佇列層級 HTTP URI 覆寫功能和新的 BufferTask API,透過直接傳送 HTTP 要求,更輕鬆地建立 HTTP 目標工作。凡是可傳送 HTTP 要求的應用程式,現在可以建立 HTTP 目標工作。

b1606516297fc4b6.png

什麼是 BufferTask API?

CreateTask API 是建立 Tasks 的舊方式,需要用戶端透過 Task 物件將 Task 物件傳送至 API,並設定所有必填欄位。

BufferTask API 是一項新功能,可讓使用者建立 HTTP 工作,而不必提供任何「工作設定」(HTTP 網址、標頭、授權),方便您直接將訊息或要求內文傳送至 Buffer API。

這樣一來,您無須變更用戶端程式碼,即可將 Cloud Tasks 部署至服務前方,因此可以更輕鬆地整合服務。任何傳送至 BufferTask API 的任意 HTTP 要求都會包裝為 Task 物件,並傳送至在佇列層級設定的目的地。

如要使用 BufferTask API,佇列必須設有目標 URI 設定。換句話說,使用 BufferTask API 的先決條件是佇列層級轉送設定功能。

建立含有轉送設定的 Cloud Tasks 佇列

建立佇列並將轉送設定指向我們在上一步中部署的第一個服務:

SERVICE1=hello1
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)')
SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g')
QUEUE3=http-queue-uri-override-buffer

gcloud beta tasks queues create $QUEUE3 \
  --http-uri-override=host:$SERVICE1_HOST \
  --location=$LOCATION

暫時暫停佇列,以便在建立 HTTP 工作時觀察這些工作:

gcloud tasks queues pause $QUEUE3 --location=$LOCATION

9. 使用 BufferTask API 緩衝 HTTP 要求

在這個步驟中,您將使用 BufferTask API 緩衝簡單的 HTTP GET 或 POST 要求。在以下說明中,Cloud Tasks 會使用佇列的預設轉送設定,將這些 HTTP 要求納入 HTTP 工作。

首先,登入取得存取權杖並設定一些變數:

gcloud auth application-default login
ACCESS_TOKEN=$(gcloud auth application-default print-access-token)
PROJECT_ID=$(gcloud config get-value project)
TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"

建立 HTTP 工作

使用 BufferTask API 建立 HTTP 工作。請注意,這是一項簡單的 HTTP GET 要求,無需建立 Task:

curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

使用 HTTP POST 和主體建立另一個 HTTP 工作:

curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d "{'message': 'Hello World'}"

選用步驟:您也可以透過用戶端程式庫建立 HTTP 工作。舉例來說,您可以查看 Program.cs 提供的 C# 範例,其中 HTTP GET 要求會直接傳送至 BufferTask API,無需納入 Task 或需要使用 Cloud Tasks 的用戶端程式庫:

var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer";

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}");
    var response = await client.GetAsync(BufferTaskApiUrl);
    var content = await response.Content.ReadAsStringAsync();
    Console.WriteLine($"Response: {content}");
}

您可以按照下列步驟執行:

dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN

BufferTask API 會從 HTTP 要求中建立「工作」,並從佇列的轉送設定中新增網址。

測試 HTTP 工作

恢復佇列:

gcloud tasks queues resume $QUEUE3 --location=$LOCATION

您應該會看到 Cloud Run 服務收到了來自 Cloud Tasks 的 HTTP GET 和 POST 要求:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
---
httpRequest:
  latency: 0.002279292s
  protocol: HTTP/1.1
  remoteIp: 35.243.23.42
  requestMethod: POST
  requestSize: '777'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5450'
  serverIp: 216.239.32.53
  status: 200
  userAgent: Google-Cloud-Tasks
...
httpRequest:
  latency: 0.228982142s
  protocol: HTTP/1.1
  remoteIp: 35.187.132.84
  requestMethod: GET
  requestSize: '426'
  requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/
  responseSize: '5510'
  serverIp: 216.239.34.53
  status: 200
  userAgent: Google-Cloud-Tasks

10. 恭喜

恭喜,您已完成程式碼研究室!

接下來,您可以嘗試使用 Cloud Tasks 做為 Pub/Sub 和 Cloud Run 之間的緩衝區,透過實際範例瞭解 Cloud Tasks 的這些新功能如何協助在服務之間輕鬆建立緩衝區佇列。

清除所用資源 (選用)

如要避免產生費用,建議您清除資源。

如果不需要專案,您可以直接刪除專案。

gcloud projects delete $PROJECT_ID

如果您需要這項專案,可以個別刪除資源。

刪除 Cloud Run 服務:

gcloud run services delete $SERVICE1 --region $REGION
gcloud run services delete $SERVICE2 --region $REGION

刪除 Cloud Tasks 佇列:

gcloud tasks queues delete $QUEUE1 --location=$LOCATION
gcloud tasks queues delete $QUEUE2 --location=$LOCATION
gcloud tasks queues delete $QUEUE3 --location=$LOCATION

涵蓋內容

  • 如何建立 HTTP 目標工作。
  • 如何使用新的佇列層級 HTTP URI 覆寫功能建立 HTTP 目標工作。
  • 如何使用新的佇列層級 HTTP URI 覆寫來變更待處理工作。
  • 如何使用新的 BufferTask API 更輕鬆地緩衝 HTTP 要求。