這份文件提供發布訊息的相關資訊。
發布者應用程式可建立訊息,並將訊息傳送至「主題」。Pub/Sub 會為現有訂閱者提供至少一次的訊息傳送與最佳服務排序。
發布者應用程式的一般流程如下:
- 建立包含資料的訊息。
- 傳送請求至 Pub/Sub 伺服器,以將訊息發布至指定主題。
事前準備
設定發布工作流程前,請先完成下列工作:
必要的角色
如要取得將訊息發布至主題所需的權限,請要求管理員授予主題的 Pub/Sub 發布者 (roles/pubsub.publisher
) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
您需要其他權限,才能建立或更新主題和訂閱項目。
訊息格式
訊息包含訊息資料和中繼資料的欄位。在訊息中指定至少下列其中一項:
Pub/Sub 服務會在訊息中加入下列欄位:
- 主題專屬的訊息 ID
- Pub/Sub 服務收到訊息時的時間戳記
如要進一步瞭解訊息,請參閱「訊息格式」。
發布訊息
您可以使用 Google Cloud 控制台、Google Cloud CLI、Pub/Sub API 和用戶端程式庫發布訊息。用戶端程式庫可以非同步發布訊息。
下列範例說明如何將訊息發布至主題。
控制台
如要發布訊息,請按照下列步驟操作:
前往 Google Cloud 控制台的「Pub/Sub topics」(Pub/Sub 主題) 頁面。
按一下主題 ID。
在「主題詳細資料」頁面的「訊息」下方,按一下「發布訊息」。
在「郵件內文」欄位中輸入訊息資料。
按一下 [發布]。
gcloud
如要發布訊息,請使用 gcloud pubsub topics publish 指令:
gcloud pubsub topics publish TOPIC_ID \ --message=MESSAGE_DATA \ [--attribute=KEY="VALUE",...]
更改下列內容:
- TOPIC_ID:主題的 ID
- MESSAGE_DATA:包含訊息資料的字串
- KEY:訊息屬性的鍵
- VALUE:訊息屬性鍵的值
REST
如要發布訊息,請傳送類似下列內容的 POST 要求:
POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID:publish Content-Type: application/json Authorization: Bearer $(gcloud auth application-default print-access-token)
更改下列內容:
- PROJECT_ID:含有主題的專案 ID
- TOPIC_ID:主題的 ID
指定以下要求主體欄位:
{ "messages": [ { "attributes": { "KEY": "VALUE", ... }, "data": "MESSAGE_DATA", } ] }
更改下列內容:
- KEY:訊息屬性的鍵
- VALUE:訊息屬性鍵的值
- MESSAGE_DATA:採用 Base64 編碼的字串,內含訊息資料
訊息必須包含非空白資料欄位,或至少一個屬性。
如果要求成功,回應會是含有訊息 ID 的 JSON 物件。以下是含有訊息 ID 的回應範例:
{ "messageIds": [ "19916711285", ] }
C++
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C# 設定操作說明進行操作。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 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 Ruby API 參考說明文件。
發布訊息後,Pub/Sub 服務會將訊息 ID 傳回給發布者。
運用屬性發布訊息
您可在 Pub/Sub 訊息中將自訂屬性嵌入為中繼資料。屬性可用來提供額外的訊息相關資訊,例如優先順序、來源或目的地。屬性也可以用來篩選訂閱項目中的訊息。
在訊息中使用屬性時,請遵守下列規範:
屬性可以是文字字串或位元組字串。
每則訊息最多可有 100 個屬性。
屬性鍵開頭不得為
goog
,且不得超過 256 個位元組。屬性值不得超過 1024 個位元組。
訊息結構定義可利用下列方式表示:
{ "data": string, "attributes": { string: string, ... }, "messageId": string, "publishTime": string, "orderingKey": string }
如果是發布端重複訊息,即使 messageId
相同,同一個用戶端原始訊息的 publishTime
值也可能不同。
PubsubMessage
JSON 結構定義是以 REST 及 RPC 說明文件的一部分發布。您可以將自訂屬性用於事件時間戳記。
下列範例說明如何將含有屬性的訊息發布至主題。
控制台
如要發布含有屬性的訊息,請按照下列步驟操作:
前往 Google Cloud 控制台的「主題」頁面。
按一下要發布訊息的主題。
在主題詳細資料頁面中,按一下「Messages」(訊息)。
按一下「發布訊息」。
在「郵件內文」欄位中輸入訊息資料。
在「訊息屬性」下方,按一下「新增屬性」。
輸入鍵/值組合。
視需要新增其他屬性。
按一下 [發布]。
gcloud
gcloud pubsub topics publish my-topic --message="hello" \ --attribute="origin=gcloud-sample,username=gcp,eventTime='2021-01-01T12:00:00Z'"
C++
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C# 設定操作說明進行操作。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的操作說明設定 Java 環境。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Python
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Python 設定操作說明來進行。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
運用排序鍵發布訊息
如要在訂閱端用戶端依序接收訊息,您必須設定發布端用戶端,以發布含有排序鍵的訊息。
如要瞭解排序鍵的概念,請參閱「排序訊息」。
以下是發布商用戶端有序訊息傳遞功能的重要考量事項:
單一發布端用戶端的排序:如果單一發布端用戶端在同一區域中發布排序鍵相同的訊息,訂閱端用戶端就會按照發布順序接收這些訊息。舉例來說,如果發布商用戶端使用排序鍵 A 發布訊息 1、2 和 3,訂閱端用戶端會依序收到這些訊息。
跨多個發布端用戶端排序:即使多個發布端用戶端使用相同的排序鍵,訂閱端用戶端收到的訊息順序,仍會與訊息在同一區域的發布順序一致。但發布商客戶本身並不知道這筆訂單。
舉例來說,如果發布者用戶端 X 和 Y 各自發布含有排序鍵 A 的訊息,且 Pub/Sub 先收到 X 的訊息,再收到 Y 的訊息,則所有訂閱者用戶端都會先收到 X 的訊息,再收到 Y 的訊息。如果需要確保不同發布端用戶端之間的訊息順序,這些用戶端必須實作額外的協調機制,確保不會同時發布含有相同排序鍵的訊息。舉例來說,發布時可使用鎖定服務來維護排序鍵的擁有權。
跨區域排序:只有在排序鍵的發布作業位於同一區域時,系統才會保證訊息傳送順序。如果發布者應用程式將含有相同排序鍵的訊息發布至不同區域,系統就無法強制執行這些發布作業的順序。訂閱者可以連線至任何區域,且排序保證仍會維持。
在 Google Cloud中執行應用程式時,應用程式預設會連線至同一區域的 Pub/Sub 端點。因此,在Google Cloud 內單一區域執行應用程式,通常可確保您與單一區域互動。
在Google Cloud 外部或多個區域中執行發布商應用程式時,您可以在設定 Pub/Sub 用戶端時使用位置端點,確保連線至單一區域。Pub/Sub 的所有位置端點都指向單一區域。如要進一步瞭解位置端點,請參閱 Pub/Sub 端點。如需 Pub/Sub 的所有位置端點清單,請參閱位置端點清單。
發布失敗:如果使用排序鍵發布失敗,發布者中具有相同排序鍵的待處理訊息也會失敗,包括這個排序鍵的未來發布要求。發生這類失敗時,您必須使用排序鍵繼續發布。如需繼續發布作業的範例,請參閱「使用排序鍵重試要求」。
您可以使用 Google Cloud 控制台、Google Cloud CLI、Pub/Sub API 或用戶端程式庫,發布含有排序鍵的訊息。
控制台
如要發布含有屬性的訊息,請按照下列步驟操作:
前往 Google Cloud 控制台的「主題」頁面。
按一下要發布訊息的主題。
在主題詳細資料頁面中,按一下「Messages」(訊息)。
按一下「發布訊息」。
在「郵件內文」欄位中輸入訊息資料。
在「訊息排序」欄位中,輸入排序鍵。
按一下 [發布]。
gcloud
如要發布含有排序鍵的訊息,請使用 gcloud pubsub topics publish
指令和 --ordering-key
標記:
gcloud pubsub topics publish TOPIC_ID \ --message=MESSAGE_DATA \ --ordering-key=ORDERING_KEY
更改下列內容:
- TOPIC_ID:主題的 ID
- MESSAGE_DATA:包含訊息資料的字串
- ORDERING_KEY:含有排序鍵的字串
REST
如要發布含有排序鍵的訊息,請傳送類似下列的 POST 要求:
POST https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID:publish Content-Type: application/json Authorization: Bearer $(gcloud auth application-default print-access-token)
更改下列內容:
- PROJECT_ID:含有主題的專案 ID
- TOPIC_ID:主題的 ID
指定以下要求主體欄位:
{ "messages": [ { "attributes": { "KEY": "VALUE", ... }, "data": "MESSAGE_DATA", "ordering_key": "ORDERING_KEY", } ] }
更改下列內容:
- KEY:訊息屬性的鍵
- VALUE:訊息屬性鍵的值
- MESSAGE_DATA:採用 Base64 編碼的字串,內含訊息資料
- ORDERING_KEY:含有排序鍵的字串
訊息必須包含非空白資料欄位,或至少一個屬性。
如果要求成功,回應會是含有訊息 ID 的 JSON 物件。以下是含有訊息 ID 的回應範例:
{ "messageIds": [ "19916711285", ] }
C++
在試用這個範例之前,請先按照「快速入門:使用用戶端程式庫」中的 C++ 設定操作說明進行操作。詳情請參閱 Pub/Sub C++ API 參考說明文件。
C#
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 C# 設定操作說明進行操作。詳情請參閱 Pub/Sub C# API 參考說明文件。
Go
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Go 設定說明進行操作。詳情請參閱 Pub/Sub Go API 參考說明文件。
Java
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Java 設定操作說明進行操作。詳情請參閱 Pub/Sub Java API 參考說明文件。
Node.js
在嘗試這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Node.js 設定說明進行操作。詳情請參閱 Pub/Sub Node.js API 參考說明文件。
Python
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫中的 Python 設定操作說明來進行。詳情請參閱 Pub/Sub Python API 參考說明文件。
Ruby
在試用這個範例之前,請先按照快速入門:使用用戶端程式庫的操作說明設定 Ruby 環境。詳情請參閱 Pub/Sub Ruby API 參考說明文件。
監控發布者
Cloud Monitoring 提供多項指標,可監控主題。
如要監控主題並維持發布商的健康狀態,請參閱「維持發布商的健康狀態」。
後續步驟
如要限制 Pub/Sub 儲存訊息資料的位置,請參閱「限制 Pub/Sub 資源位置」。
如要按照結構定義發布訊息,請參閱結構定義總覽。
如要瞭解如何設定進階運送選項,請參閱下列文章: