設定訊息儲存政策

如果您發布訊息至全球 Pub/Sub 端點,Pub/Sub 會自動將訊息儲存在最靠近的Google Cloud 區域。如要控管訊息儲存和處理的區域,可以為主題設定訊息儲存政策

訊息儲存政策總覽

建立新主題或使用控制台、Google Cloud CLI 或 REST API 更新主題時,可以設定訊息儲存政策。

郵件儲存空間政策僅適用於郵件內容。這項政策不適用於其他資料,例如主題名稱、標籤或身分與存取權管理 (IAM) 設定。

當用戶端將訊息發布至 Pub/Sub 時,Pub/Sub 會儲存訊息。訊息儲存政策可確保 Pub/Sub 只會在您指定的一組Google Cloud 區域儲存及處理訊息,無論發布或訂閱要求來自何處。如果政策允許發布作業使用多個區域,Pub/Sub 會將訊息儲存在允許的區域中,且該區域最靠近發布的訊息進入 Google Cloud 網路的位置。

指定訊息儲存政策時,您可以設定 enforceInTransitTrue。這個標記會控管下列項目:

  • 如果訊息儲存政策不允許在特定區域中儲存訊息,系統就會拒絕在該區域收到的發布、提取和串流提取要求,並傳回 FAILED_PRECONDITION 錯誤。

  • 如果用戶端在允許的區域 Google Cloud 內執行 (例如在 Compute Engine VM 中),就可以使用全域端點。用戶端的要求會在允許的區域中於本機轉送。 用戶端也可以使用以允許區域為目標的位置端點區域端點

  • 如果用戶端在不允許的區域內執行,或在區域外執行,則必須使用以允許區域清單中區域為目標的區域或區域端點。 Google Cloud Google Cloud

  • 推送訂閱項目的傳送作業只會在允許的 Cloud 區域內處理。在某些情況下,這項限制可能會完全暫停推送訂閱的訊息傳送作業。如果推送訂閱項目因訊息儲存位置、允許的區域和匯出資源位置等因素,導致推送位置受到過度限制,就會進入這種狀態,並顯示在 Stackdriver 中。

新主題的訊息儲存政策

  • 如果您在建立主題時未指定訊息儲存政策,系統會根據有效的資源位置限制機構政策,自動決定訊息儲存政策。如果沒有生效的機構政策,訊息儲存政策會允許所有地區。

  • 同樣地,如果沒有指定訊息儲存政策,系統會根據有效的「強制執行 Pub/Sub 訊息的傳輸中區域」組織政策,判斷 enforceInTransit 旗標。如要進一步瞭解這項組織政策,請參閱「組織政策限制」。

  • 建立主題時,如果指定訊息儲存政策,該政策只能包含有效資源位置限制機構政策允許的區域。如果沒有生效的機構政策,訊息儲存政策可以包含任何區域。

現有主題的訊息儲存政策

  • 機構政策更新後,變更不會自動傳播至現有主題。因此,現有主題的訊息儲存政策可能會與最新的機構政策不同步。詳情請參閱「管理機構和主題政策之間的差異」。

  • 更新主題的訊息儲存政策後,變更「不會」套用至已發布的訊息。根據舊政策儲存的訊息不會移至新政策適用的位置。而是只會套用至更新後發布的訊息。

例外狀況

這項政策會指定允許的 Google Cloud 區域名稱清單。因此,系統不支援下列項目:

  • 排除清單
  • 可用區或多區域位置

如果您發布的訊息含有排序鍵,且訊息儲存空間政策排除最靠近的區域,Pub/Sub 服務會傳回錯誤。

設定訊息儲存政策

設定主題訊息儲存政策的方法有兩種,包括:

  • 使用機構政策設定訊息儲存政策。
  • 建立主題時,請設定訊息儲存政策。

使用機構政策設定訊息儲存政策

控制台

如要設定適用於多個主題的訊息儲存政策,請設定資源位置限制機構政策。

  1. 前往 Identity and Access Management 控制台的「Organization policies」(機構政策) 頁面。

    前往「Organization policies」(組織政策)

  2. 選取要設定機構政策的資源階層節點 (機構、資料夾或專案)。

  3. 在篩選器中輸入「Resource Location Restriction」(資源位置限制)

  4. 按一下「Google Cloud - Resource Location Restriction」(資源位置限制)

  5. 點選「編輯」

  6. 視需要新增或移除區域。

    您建立的任何新主題都會沿用這些設定。變更不會自動套用至現有主題。如要更新現有主題,請執行更新作業

如要進一步瞭解機構政策,請參閱「管理資源 Google Cloud 」。

建立主題時設定訊息儲存政策

控制台

使用 Google Cloud 控制台時,您無法在建立主題時設定訊息儲存政策。所有新主題都會自動沿用您的資源位置限制機構政策。

不過,建立主題後,您可以在控制台中透過更新作業變更訊息儲存政策。

gcloud CLI

如要建立具有特定訊息儲存政策的主題,請使用 gcloud pubsub topics create 指令並加上 --message-storage-policy-allowed-regions 標記:

gcloud pubsub topics create TOPIC_ID \
    --message-storage-policy-allowed-regions=REGION1,REGION2

更改下列內容:

  • TOPIC_ID:新主題的 ID 或名稱。
  • REGION1, REGION2:以半形逗號分隔的 Google Cloud 支援區域清單。

REST

如要建立主題並設定訊息儲存政策,請使用 projects.topics.create 方法。

要求必須使用 Authorization 標頭中的存取權杖進行驗證。如要取得目前應用程式預設憑證的存取權杖,請執行 gcloud auth application-default print-access-token

 POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
 Authorization: Bearer $(gcloud auth application-default print-access-token)
 Content-Type: application/json --data @response-body.json

指定以下要求主體欄位:

{
  "name": "projects/PROJECT_ID/topics/TOPIC_ID",
  "messageStoragePolicy": {
    "allowedPersistenceRegions": ["REGION"],
    "enforceInTransit": true
  }
}

其中:

  • PROJECT_ID 是您的專案 ID。

  • TOPIC_ID 是主題 ID。

  • REGION 是您指定的地區。

回應範例:

{
  "name": "projects/PROJECT_ID/topics/TOPIC_ID",
  "messageStoragePolicy": {
    "allowedPersistenceRegions": [
      "REGION"
    ],
    "enforceInTransit": true
  }
}

如要進一步瞭解如何設定訊息儲存政策,請參閱下列 API 參考資料。

更新訊息儲存政策

控制台

  1. 在 Google Cloud 控制台中,開啟「主題詳細資料」頁面。

    前往主題詳細資料

  2. 選取要更新的主題。

    你可以選取多個主題。

  3. 在「資訊面板」中,選取「儲存空間政策」分頁標籤。

    這個面板預設可能會收合。如果面板已收合,請按一下「顯示資訊面板」

  4. 視需要選取或取消選取多個區域。

  5. 按一下「Update」

gcloud CLI

如要將機構資源位置限制政策中定義的訊息儲存政策推送至主題,請執行下列指令:gcloud pubsub topics update

gcloud pubsub topics update TOPIC_ID \
    --recompute-message-storage-policy

如要更新主題的訊息儲存政策,並指定特定區域,請執行 gcloud pubsub topics update 指令並加上 --message-storage-policy-allowed-regions 標記:

gcloud pubsub topics update TOPIC_ID \
    --message-storage-policy-allowed-regions=REGION1,REGION2

更改下列內容:

  • TOPIC_ID:要更新的主題 ID。
  • REGION1, REGION2:以半形逗號分隔的 Google Cloud 支援區域清單。

REST

如要使用訊息儲存政策更新主題,請使用 projects.topics.patch 方法。

要求必須使用 Authorization 標頭中的存取權杖進行驗證。如要取得目前應用程式預設憑證的存取權杖,請執行 gcloud auth application-default print-access-token

 PATCH https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
 Authorization: Bearer $(gcloud auth application-default print-access-token)
 Content-Type: application/json --data @response-body.json

指定以下要求主體欄位:

{
  "name": "projects/PROJECT_ID/topics/TOPIC_ID",
  "messageStoragePolicy": {
    "allowedPersistenceRegions": ["REGION"], // Replace with your required region
    "enforceInTransit": true
  }
}

其中:

  • PROJECT_ID 是您的專案 ID。

  • TOPIC_ID 是主題 ID。

  • REGION 是您指定的地區。

回應範例:

{
  "name": "projects/PROJECT_ID/topics/TOPIC_ID",
  "messageStoragePolicy": {
    "allowedPersistenceRegions": [
      "REGION"
    ],
    "enforceInTransit": true
  }
}

如要進一步瞭解如何更新訊息儲存空間政策,請參閱下列 API 參考資料。

管理機構和主題政策之間的差異

查看機構政策和主題政策的差異

控制台

控制台會顯示機構政策與個別主題的訊息儲存空間政策之間的差異。 Google Cloud

如要查看是否有任何主題與機構政策不同步,請按照下列步驟操作:

  1. 前往「主題詳細資料」頁面。

    前往主題詳細資料

  2. 選取主題。

  3. 在「資訊面板」中,選取「儲存空間政策」分頁標籤。

    這個面板預設可能會收合。如果資訊面板已收合,請按一下「顯示資訊面板」

    面板會顯示儲存空間政策,以及機構和主題政策之間的差異。

gcloud CLI

如要檢查目前指派給主題的政策,請執行下列指令:

gcloud pubsub topics describe TOPIC_ID

更改下列內容:

  • TOPIC_ID:您要檢查的主題 ID。

解決機構和主題政策之間的差異

控制台

  1. 在 Google Cloud 控制台中,開啟「主題詳細資料」頁面。

    前往 Pub/Sub

  2. 選取主題。

  3. 在「資訊面板」中,選取「儲存空間政策」分頁標籤。

    這個面板預設可能會收合。如果面板已收合,請按一下「顯示資訊面板」

    面板會顯示儲存空間政策和任何差異。

    如有任何差異,資訊面板會顯示三個選項,可將主題的儲存空間政策與機構政策同步,包括:

    • 主題允許儲存在不允許的位置

      進行更新,僅允許訊息儲存在政策允許的位置。

    • 主題不允許儲存在某些允許的位置

      進行更新,允許訊息儲存在政策允許的任何位置。

    • 主題不允許和允許的位置皆已過期

      進行更新,允許訊息儲存在政策允許的位置。

  4. 選取適當選項來解決問題。

  5. 按一下「更新主題」

    系統會開啟「同步處理至機構儲存政策」對話方塊。

  6. 按一下「更新主題」

監控與疑難排解

為協助您瞭解訊息資料的儲存位置,Pub/Sub 提供按各 Google Cloud 區域細分的指標。

您可以運用這些指標:

  • 瞭解資料在全球的分布情形。
  • 根據這些資料,最佳化發布端和訂閱端部署位置。

郵件儲存空間指標

未確認的已儲存訊息數量:

subscription/num_unacked_messages_by_region

儲存的資料量:

subscription/unacked_bytes_by_region

最舊訊息存在時間:

subscription/oldest_unacked_message_age_by_region

主題和快照可使用類似指標。此外,系統也會提供已確認訊息的相應指標,這些訊息可選擇保留以供重播。例如:

subscription/num_retained_acked_messages_by_region

效能和可用性影響

訊息儲存政策不會影響整體服務水準協議,但如果發布商或訂閱者在政策不允許的區域 Google Cloud 或外部執行作業,就會出現可用性控管的取捨問題。如果使用者在訊息儲存空間政策允許的區域內執行發布商用戶端,服務延遲或可用性不會有任何變化。

如要瞭解這些取捨,請考慮發布要求的轉送方式。一般來說,Pub/Sub 會盡可能將訊息儲存在最接近要求來源的位置。一般來說,在Google Cloud 內發出的要求會繫結至相同區域的 Pub/Sub 執行個體。如果發布者位於單一區域,即使在訊息儲存政策中新增更多區域,也不會提高可用性。從 Google Cloud外部發布訊息時,系統會多一層轉送機制,將要求傳送至附近的 Google Cloud 區域,該區域必須提供 Pub/Sub 服務。

請考慮採用只允許 us-central1 區域的郵件儲存政策。

  1. us-east1 中執行的發布端用戶端發出 Publish 要求。
  2. 要求會路由至 us-east1 中的 Pub/Sub 伺服器。
  3. 要求不會將資料儲存在「us-east1」,而是會轉送至訊息儲存空間政策允許且距離最近的區域,也就是「us-central1」。
  4. Pub/Sub 會將發布的訊息儲存在 us-central1 中,並從該位置將訊息轉送給訂閱端。

這項機制會影響要求延遲時間和整體系統可用性。由於要求會經過更多網路連結,因此完成時間較長,失敗的機率也相對較高。這也表示訊息必須先傳送至最近的允許區域,才能進行傳送,因此訂閱者可能會稍晚收到訊息。如果政策允許單一區域,但發布商應用程式在多個區域中執行,分散式應用程式的可用性就會受到限制,只能在允許的單一區域中運作。

後續步驟