如果您將訊息發布至全球 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 服務就會傳回錯誤。
設定郵件儲存空間政策
設定主題的訊息儲存政策有兩種方式,包括:
- 使用機構政策設定訊息儲存政策。
- 建立主題時設定訊息儲存政策。
使用機構政策設定訊息儲存政策
控制台
如要設定適用於多個主題的訊息儲存政策,請設定資源位置限制機構政策。
前往身分與存取權管理控制台中的「Organization policies」(機構政策) 頁面。
選取要設定機構政策的資源階層節點 (機構、資料夾或專案)。
在篩選器中輸入「Resource Location Restriction」。
按一下「Google Cloud - 資源位置限制」。
點選「編輯」。
視需要新增或移除區域。
您建立的任何新主題都會繼承這些設定。變更不會自動套用至現有主題。如要更新現有主題,您必須執行更新作業。
如要進一步瞭解機構政策,請參閱「管理 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 參考資料。
更新郵件儲存空間政策
控制台
在 Google Cloud 控制台中,開啟「Topic details」頁面。
選取要更新的主題。
您可以選取多個主題。
在「資訊面板」中,選取「儲存空間政策」分頁標籤。
這個面板可能會預設為收合。如果資訊面板處於收合狀態,請按一下「Show info panel」。
視需要選取或取消選取任意地區。
按一下 [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 主控台會顯示機構政策與個別主題的訊息儲存空間政策之間的差異。
如要查看是否有任何主題不符合貴機構政策,請按照下列步驟操作:
前往「主題詳細資料」頁面。
選取主題。
在「資訊面板」中,選取「儲存空間政策」分頁標籤。
這個面板可能會預設為收合。如果是收合狀態,請按一下「Show info panel」。
面板會顯示您的儲存空間政策,以及機構和主題政策之間的差異。
gcloud CLI
如要查看目前指派給主題的政策,請執行下列指令:
gcloud pubsub topics describe TOPIC_ID
更改下列內容:
TOPIC_ID
:您要檢查的主題 ID。
解決機構和主題政策之間的差異
控制台
在 Google Cloud 控制台中,開啟「Topic details」頁面。
選取主題。
在「資訊面板」中,選取「儲存空間政策」分頁標籤。
這個面板可能會預設為收合。如果資訊面板處於收合狀態,請按一下「Show info panel」。
面板會顯示您的儲存空間政策,以及任何差異。
如果有任何差異,資訊面板會顯示三個選項,讓您將主題的儲存空間政策與機構政策同步,包括:
主題允許儲存在不允許的位置。
進行更新,僅允許訊息儲存在政策允許的位置。
主題不允許儲存於部分允許的位置。
進行更新,允許訊息儲存在政策允許的任何位置。
主題不允許和允許的位置皆已過期。
進行更新,允許訊息儲存在政策允許的位置。
選取適當的選項來解決問題。
按一下「更新主題」。
系統會開啟「Sync to organization storage policy」對話方塊。
按一下「更新主題」。
監控與疑難排解
為協助您瞭解訊息資料儲存的位置,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
區域的郵件儲存空間政策。
- 在
us-east1
中執行的發布端用戶端會發出Publish
要求。 - 要求會路由至
us-east1
中的 Pub/Sub 伺服器。 - 系統會將要求轉送至訊息儲存空間政策允許的最近區域,而非將資料儲存在
us-east1
中,該區域即為us-central1
。 - Pub/Sub 會將發布的訊息儲存在
us-central1
中,並將訊息轉送至該位置的訂閱者。
這個機制會影響要求延遲時間和整體系統可用性。由於要求會遍歷更多網路連結,因此需要較長的時間才能完成,且失敗的機率也相對較高。這也表示,由於訊息必須先傳送到最近的允許區域,才能派送,因此訂閱者可能會稍晚才看到訊息。如果政策允許單一區域,但發布者應用程式在多個區域中執行,則分散式應用程式只會在單一允許的區域中提供。
後續步驟
- 如要進一步瞭解如何使用全球或位置端點,請參閱 Pub/Sub API 總覽。