設定郵件儲存空間政策

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

訊息儲存空間政策總覽

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

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

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

指定訊息儲存政策時,您可以將 enforceInTransit 設為 True。這個標記會控制下列項目:

  • 如果在訊息儲存空間政策中不允許的區域中收到發布、拉取和 streamingPull 要求,系統會拒絕要求並傳回 FAILED_PRECONDITION 錯誤。

  • 推播訂閱項目的傳送作業僅會在允許的雲端區域內處理。在某些情況下,這項限制可能會完全暫停推播訂閱項目的訊息傳送。如果推送位置受到多項因素 (例如訊息儲存位置、允許的區域和匯出資源位置) 的過度限制,推送訂閱項目就會進入這種狀態,這時您會在 Stackdriver 中看到這項狀態。

新主題的郵件儲存空間政策

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

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

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

現有主題的訊息儲存政策

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

  • 主題的訊息儲存政策更新後,變更不會傳播至已發布的訊息。已根據舊版政策儲存的訊息「不會」移至符合新政策的資料夾。而是只會套用至更新後發布的訊息。

例外狀況

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

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

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

設定郵件儲存空間政策

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

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

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

控制台

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

  1. 前往身分與存取權管理控制台中的「Organization policies」(機構政策) 頁面。

    前往「機構政策」

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

  3. 在篩選器中輸入「Resource Location Restriction」

  4. 按一下「Google Cloud - 資源位置限制」

  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 控制台中,開啟「Topic details」頁面。

    前往主題詳細資料

  2. 選取要更新的主題。

    您可以選取多個主題。

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

    這個面板可能會預設為收合。如果資訊面板處於收合狀態,請按一下「Show info panel」

  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. 在「資訊面板」中,選取「儲存空間政策」分頁標籤。

    這個面板可能會預設為收合。如果是收合狀態,請按一下「Show info panel」

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

gcloud CLI

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

gcloud pubsub topics describe TOPIC_ID

更改下列內容:

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

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

控制台

  1. 在 Google Cloud 控制台中,開啟「Topic details」頁面。

    前往 Pub/Sub

  2. 選取主題。

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

    這個面板可能會預設為收合。如果資訊面板處於收合狀態,請按一下「Show info panel」

    面板會顯示您的儲存空間政策,以及任何差異。

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

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

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

    • 主題不允許儲存於部分允許的位置

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

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

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

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

  5. 按一下「更新主題」

    系統會開啟「Sync to organization storage policy」對話方塊。

  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以外的位置發布時,系統會額外加入路由層,將要求傳送至可使用 Pub/Sub 服務的附近 Google Cloud 區域。

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

  1. us-east1 中執行的發布端用戶端會發出 Publish 要求。
  2. 要求會路由至 us-east1 中的 Pub/Sub 伺服器。
  3. 系統會將要求轉送至訊息儲存空間政策允許的最近區域,而非將資料儲存在 us-east1 中,該區域即為 us-central1
  4. Pub/Sub 會將發布的訊息儲存在 us-central1 中,並將訊息轉送至該位置的訂閱者。

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

後續步驟

  • 如要進一步瞭解如何使用全球或位置端點,請參閱 Pub/Sub API 總覽