本文提供發布訊息的相關資訊。
發布者應用程式會建立訊息並傳送至主題。Pub/Sub 會盡可能按照順序,將訊息至少傳送一次給現有訂閱者。
發布者應用程式的一般流程如下:
- 建立包含資料的訊息。
- 向 Pub/Sub 伺服器傳送要求,將訊息發布至指定主題。
事前準備
設定發布工作流程前,請務必完成下列工作:
必要的角色
如要取得將訊息發布至主題所需的權限,請要求管理員授予您主題的 Pub/Sub 發布者 (roles/pubsub.publisher) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
您需要額外權限,才能建立或更新主題和訂閱項目。
訊息格式
訊息是由包含訊息資料和中繼資料的欄位組成。請在訊息中指定下列至少一項:
Pub/Sub 服務會在訊息中加入下列欄位:
- 主題專屬的訊息 ID
- Pub/Sub 服務收到訊息的時間戳記
如要進一步瞭解訊息,請參閱「訊息格式」。
發布訊息
您可以使用 Google Cloud 控制台、Google Cloud CLI、Pub/Sub API 和用戶端程式庫發布訊息。用戶端程式庫可以非同步發布訊息。
下列範例說明如何將訊息發布至主題。
控制台
發布訊息的步驟如下:
前往 Google Cloud 控制台的「Pub/Sub topics」(Pub/Sub 主題) 頁面。
按一下主題 ID。
在「Topic details」(主題詳細資料) 頁面的「Messages」(訊息) 下方,按一下「Publish message」(發布訊息)。
在「Message body」(郵件內文) 欄位中,輸入訊息資料。
按一下「發布」。
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 用戶端程式庫的主要版本 (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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby v2 程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明進行操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Rust
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Rust 設定操作說明進行操作。詳情請參閱 Pub/Sub Rust 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 控制台的「Topics」(主題) 頁面。
按一下要發布訊息的主題。
在主題詳細資料頁面中,按一下「Messages」(訊息)。
按一下「Publish message」(發布訊息)。
在「Message body」(郵件內文) 欄位中,輸入訊息資料。
在「Message attributes」(訊息屬性) 下方,按一下「Add an attribute」(新增屬性)。
輸入鍵/值組合。
視需要新增更多屬性。
按一下「發布」。
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 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby v2 程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明進行操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Rust
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Rust 設定操作說明進行操作。詳情請參閱 Pub/Sub Rust API 參考文件。
使用排序鍵發布訊息
如要在訂閱者用戶端中依序接收訊息,您必須設定發布者用戶端,以發布含有排序鍵的訊息。
如要瞭解排序金鑰的概念,請參閱「排序訊息」。
以下是發布端用戶端排序訊息的考量重點:
單一發布端用戶端中的排序:如果單一發布端用戶端在同一區域中發布具有相同排序鍵的訊息,訂閱端用戶端會按照訊息發布的確切順序接收訊息。舉例來說,如果發布端用戶端發布訊息 1、2 和 3,且排序鍵為 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 控制台的「Topics」(主題) 頁面。
按一下要發布訊息的主題。
在主題詳細資料頁面中,按一下「Messages」(訊息)。
按一下「Publish message」(發布訊息)。
在「Message body」(郵件內文) 欄位中,輸入訊息資料。
在「Message ordering」(訊息排序) 欄位中,輸入排序金鑰。
按一下「發布」。
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 用戶端程式庫的主要版本 (v2)。如果您仍在使用第 1 版程式庫,請參閱第 2 版遷移指南。如要查看第 1 版程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 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 Pub/Sub 用戶端程式庫第 3 版。如果您仍在使用第 2 版程式庫,請參閱 第 3 版遷移指南。如要查看 Ruby v2 程式碼範例清單,請參閱 已淘汰的程式碼範例。
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Ruby 設定操作說明進行操作。詳情請參閱 Pub/Sub Ruby API 參考文件。
Rust
在試用這個範例之前,請先按照「快速入門導覽課程:使用用戶端程式庫」中的 Rust 設定操作說明進行操作。詳情請參閱 Pub/Sub Rust API 參考文件。
監控發布商
Cloud Monitoring 提供多項指標,可用於監控主題。
如要監控主題並維持發布端健康狀態,請參閱「維持發布端健康狀態」。