本文說明如何將結構定義與 Pub/Sub 主題建立關聯。
事前準備
- 瞭解 Pub/Sub 結構定義的運作方式。
- 建立結構定義。
必要角色和權限
如要取得關聯及管理結構定義所需的權限,請要求管理員授予專案的「Pub/Sub 編輯者」 (roles/pubsub.editor
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色具備關聯及管理結構定義所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要建立及管理結構定義,必須具備下列權限:
-
建立結構定義:
pubsub.schemas.create
-
將結構定義附加至主題:
pubsub.schemas.attach
-
提交結構定義修訂版本:
pubsub.schemas.commit
-
刪除結構定義或結構定義修訂版本:
pubsub.schemas.delete
-
取得結構定義或結構定義修訂版本:
pubsub.schemas.get
-
列出結構定義:
pubsub.schemas.list
-
列出結構定義修訂版本:
pubsub.schemas.listRevisions
-
回溯結構定義:
pubsub.schemas.rollback
-
驗證訊息:
pubsub.schemas.validate
-
取得結構定義的身分與存取權管理政策:
pubsub.schemas.getIamPolicy
-
設定結構定義的 IAM 政策:
pubsub.schemas.setIamPolicy
您可以將角色和權限授予主體,例如使用者、群組、網域或服務帳戶。您可以在一個專案中建立結構定義,並將其附加至位於其他專案的主題。請確認您具備每個專案的必要權限。
將結構定義與主題建立關聯的指南
建立或編輯主題時,您可以將結構定義與主題建立關聯。以下是將結構定義與主題建立關聯的指南:
您可以將結構定義與一或多個主題建立關聯。
將結構定義與主題建立關聯後,主題從發布商收到的每則訊息都必須遵循該結構定義。
將結構定義與主題建立關聯時,您也必須指定要發布的訊息編碼,如
BINARY
或JSON
。如果使用 JSON 和 Avro 結構定義,請特別注意聯集的編碼規則。如果與主題相關聯的結構定義有修訂版本,訊息必須符合編碼,並根據可用範圍內的修訂版本進行驗證。如果驗證失敗,訊息就無法發布。
系統會根據建立時間,以逆時排序嘗試修訂版本。如要建立結構定義修訂版本,請參閱「提交結構定義修訂版本」一文。
訊息結構定義的驗證邏輯
將結構定義與主題建立關聯時,如果結構定義有修訂版本,您可以指定要使用的修訂版本子集範圍。如未指定範圍,系統會使用整個範圍進行驗證。
如果您未將修訂版本指定為「允許的第一個修訂版本」,系統會使用結構定義現有的最舊修訂版本進行驗證。如果未將修訂版本指定為「允許的最新修訂版本」,系統會使用結構定義的最新現有修訂版本。
以附加至主題 T
的結構化資料 S
為例。
結構定義 S
依序建立修訂版本 ID A
、B
、C
和 D
,其中 A
是第一個或最舊的修訂版本。所有結構定義都不相同,也不會還原為現有結構定義。
如果只將「允許的第一個修訂版本」欄位設為
B
,系統會拒絕只符合結構定義A
的訊息,但會接受符合結構定義B
、C
和D
的訊息。如果只將「允許的最後修訂版本」欄位設為
C
,系統會接受符合結構定義A
、B
和C
的訊息,但會拒絕只符合結構定義D
的訊息。如果將「允許使用的第一個修訂版本」設為
B
,並將「允許使用的最後一個修訂版本」設為C
,系統就會接受符合B
和C
結構定義的訊息。您也可以將第一個和最後一個修訂版本設為相同的修訂版本 ID。 在這種情況下,系統只會接受符合該修訂版本的訊息。
建立主題時,一併建立並連結結構定義
您可以使用 Trusted Cloud 控制台、gcloud CLI、Pub/Sub API 或 Cloud 用戶端程式庫,建立含有結構定義的主題。
控制台
前往 Trusted Cloud 控制台的「Pub/Sub topics」(Pub/Sub 主題) 頁面。
按一下「建立主題」。
在「主題 ID」欄位中,輸入主題的 ID。
如要命名主題,請參閱相關規範。
勾選「使用結構定義」方塊。
其餘欄位保留預設設定。
您可以建立架構或使用現有架構。
如要建立結構定義,請按照下列步驟操作: `
- 在「Select a Pub/Sub schema」(選取 Pub/Sub 結構定義) 欄位,選取「Create a new schema」(建立新結構定義)。
「建立結構定義」頁面會顯示在次要分頁中。
按照「建立結構定義」一文中的步驟操作。
返回「建立主題」分頁,然後按一下「重新整理」。
在「選取 Pub/Sub 結構定義」欄位中搜尋結構定義。
將訊息編碼方式選為「JSON」或「二進位」。
您剛建立的結構定義有修訂版本 ID。您可以按照「提交結構定義修訂版本」一文所述,建立其他結構定義修訂版本。
如要關聯已建立的結構化資料,請按照下列步驟操作:
在「選取 Pub/Sub 結構定義」中,選取現有結構定義。
將訊息編碼方式選為「JSON」或「二進位」。
選用:如果所選結構定義有修訂版本,請使用「允許的修訂版本範圍」的下拉式選單,選取「允許的第一個修訂版本」和「允許的最後一個修訂版本」。
您可以視需求指定這兩個欄位、只指定一個,或保留預設設定。
其餘欄位保留預設設定。
按一下「建立」儲存主題,並指派給所選結構定義。
gcloud
如要建立已指派先前建立結構定義的主題,請執行 gcloud pubsub topics create
指令:
gcloud pubsub topics create TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_ID \ --first-revision-id=FIRST_REVISION_ID \ --last-revision-id=LAST_REVISION_ID \
其中:
- TOPIC_ID 是您要建立的主題 ID。
- ENCODING_TYPE 是根據結構定義驗證訊息時使用的編碼。這個值必須設為
JSON
或BINARY
。 - SCHEMA_ID 是現有結構定義的 ID。
- FIRST_REVISION_ID 是要驗證的最舊修訂版本 ID。
- LAST_REVISION_ID 是要驗證的最新修訂版本 ID。
--first-revision-id
和 --last-revision-id
都是選用欄位。
您也可以指派其他 Trusted Cloud 專案的結構定義:
gcloud pubsub topics create TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_ID \ --schema-project=SCHEMA_PROJECT \ --project=TOPIC_PROJECT
其中:
- SCHEMA_PROJECT 是 Trusted Cloud 架構專案的專案 ID。
- TOPIC_PROJECT 是 Trusted Cloud 主題專案的專案 ID。
REST
如要建立主題,請使用 projects.topics.create
方法:
要求:
要求必須使用 Authorization
標頭中的存取權杖進行驗證。如要取得目前應用程式預設憑證的存取權杖,請執行 gcloud auth application-default print-access-token
。
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID Authorization: Bearer ACCESS_TOKEN
要求主體:
{ "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
其中:
- PROJECT_ID 是您的專案 ID。
- TOPIC_ID 是主題 ID。
- SCHEMA_NAME 是發布訊息時要驗證的結構定義名稱。格式為:
projects/PROJECT_ID/schemas/SCHEMA_ID
。 - ENCODING_TYPE 是根據結構定義驗證訊息時使用的編碼。必須設為
JSON
或BINARY
。 - FIRST_REVISION_ID 是要驗證的最舊修訂版本 ID。
- LAST_REVISION_ID 是要驗證的最新修訂版本 ID。
firstRevisionId
和 lastRevisionId
都是選用欄位。
回應:
{ "name": "projects/PROJECT_ID/topics/TOPIC_ID", "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
如果要求中未提供 firstRevisionId
和 lastRevisionId
,系統會省略這兩者。
C++
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C# 設定操作說明進行操作。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
以下範例使用 Go Pub/Sub 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Java 設定操作說明進行操作。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
PHP
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 PHP 設定說明進行操作。 詳情請參閱 Pub/Sub PHP API 參考說明文件。
Python
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Python 設定操作說明來進行。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
以下範例使用 Ruby Pub/Sub 用戶端程式庫 v3。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby 第 2 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
編輯與主題相關的結構定義
您可以編輯主題,附加或移除結構定義,或是更新用於驗證訊息的修訂版本範圍。一般來說,如果計畫變更使用的結構定義,可以提交新修訂版本,並更新主題使用的修訂版本範圍。
如要編輯與主題相關聯的結構定義,可以使用Trusted Cloud 控制台、gcloud CLI、Pub/Sub API 或 Cloud 用戶端程式庫。
控制台
前往 Trusted Cloud 控制台的「Pub/Sub topics」(Pub/Sub 主題) 頁面。
按一下主題的「主題 ID」。
在主題詳細資料頁面中,按一下「編輯」。
您可以對結構進行下列變更。
變更可能需要幾分鐘才會生效。
如要從主題中移除結構定義,請在「編輯主題」頁面中,取消勾選「使用結構定義」核取方塊。
如要變更結構定義,請在「Schema」(結構定義) 區段中選取結構定義名稱。
視需要更新其他欄位。
- 如要更新修訂版本範圍,請在「修訂版本範圍」下方,使用「允許的第一個修訂版本」和「允許的最後一個修訂版本」下拉式選單。
您可以視需求指定這兩個欄位、只指定一個,或保留預設設定。
按一下「更新」儲存變更。
gcloud
gcloud pubsub topics update TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_NAME \ --first-revision-id=FIRST_REVISION_ID \ --last-revision-id=LAST_REVISION_ID \
其中:
- TOPIC_ID 是您要建立的主題 ID。
- ENCODING_TYPE 是根據結構定義驗證訊息時使用的編碼。這個值必須設為
JSON
或BINARY
。 - SCHEMA_NAME 是現有結構定義的名稱。
- FIRST_REVISION_ID 是要驗證的最舊修訂版本 ID。
- LAST_REVISION_ID 是要驗證的最新修訂版本 ID。
--first-revision-id
和 --last-revision-id
都是選用欄位。
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 ACCESS_TOKEN
要求主體:
{ "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" "update_mask": } }
其中:
- PROJECT_ID 是您的專案 ID。
- TOPIC_ID 是主題 ID。
- SCHEMA_NAME 是發布訊息時要驗證的結構定義名稱。格式為:
projects/PROJECT_ID/schemas/SCHEMA_ID
。 - ENCODING_TYPE 是根據結構定義驗證訊息時使用的編碼。必須設為
JSON
或BINARY
。 - FIRST_REVISION_ID 是要驗證的最舊修訂版本 ID。
- LAST_REVISION_ID 是要驗證的最新修訂版本 ID。
firstRevisionId
和 lastRevisionId
都是選用欄位。
回應:
{ "name": "projects/PROJECT_ID/topics/TOPIC_ID", "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
更新後,firstRevisionId
和 lastRevisionId
都不會設定。
C++
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。
Go
以下範例使用 Go Pub/Sub 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Java 設定操作說明進行操作。詳情請參閱 Pub/Sub Java API 參考說明文件。
Python
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Python 設定操作說明來進行。詳情請參閱 Pub/Sub Python API 參考說明文件。