本教學課程會逐步說明如何設定一組應用程式,透過 Pub/Sub 傳送訊息進行通訊,而非同步 RPC。透過解除應用程式與訊息的耦合,您可以:
- 可讓應用程式更穩定可靠
- 可能可以簡化開發
舉例來說,呼叫端 (發布者) 不需要接收端 (訂閱者) 處於運作狀態且可用。發布者將訊息傳送至 Pub/Sub。 發布商不需要知道哪些訂閱端應用程式需要接收訊息,也不需要知道數量。因此,只要一或多個訂閱端應用程式可用,這項服務就能將訊息傳送給這些應用程式。
系統總覽
在本教學課程中,您會啟動發布者應用程式,使用一對多通訊方式,將「Hello, World!」訊息傳送給兩位訂閱者,如下圖所示:
兩個訂閱者應用程式使用相同程式碼,但您可於不同時間啟動。這個程序說明 Pub/Sub 如何啟用非同步通訊。如要建構這個系統,請完成下列步驟:
- 建立 IAM 服務帳戶,供應用程式用於驗證。
- 設定 IAM 權限。
- 建立 Pub/Sub 主題和訂閱項目。
- 啟動三個獨立應用程式:一個發布者及兩個訂閱者。
事前準備
-
安裝 Google Cloud CLI。
-
設定 gcloud CLI,使用您的聯合身分。
詳情請參閱「使用聯合身分登入 gcloud CLI」。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Cloud de Confiance 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為要建立的專案名稱。 Cloud de Confiance -
選取您建立的 Cloud de Confiance 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Cloud de Confiance 專案名稱。
如果尚未啟用,請啟用 Pub/Sub API:
啟用 API 時所需的角色
如要啟用 API,您必須具備
serviceusage.services.enable權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable pubsub.googleapis.com
-
為使用者帳戶建立本機驗證憑證:
gcloud auth application-default login
如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。
-
將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令:
roles/pubsub.publisher, roles/pubsub.subscribergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 帳戶。如需範例,請參閱「 在 IAM 政策中代表工作團隊集區使用者」。ROLE:授予使用者帳戶的 IAM 角色。
安裝 Python
本教學課程使用 Pub/Sub 用戶端程式庫,需要 Python 3.7 以上版本。按照操作說明安裝 Python。
設定 Pub/Sub 專案
如要管理發布和訂閱應用程式之間的訊息流程,請建立主題和兩個不同的訂閱項目。
建立 Pub/Sub 主題
使用 ID hello_topic 建立主題:
gcloud pubsub topics create hello_topic
建立 Pub/Sub 訂閱項目
建立兩個訂閱項目,並附加至主題。
這些訂閱項目是 StreamingPull 訂閱項目,屬於提取訂閱項目。
訂閱方案 1
建立 ID 為 sub_one 的訂閱項目,並附加至 hello_topic。
gcloud pubsub subscriptions create sub_one --topic=hello_topic
訂閱方案 2
建立 ID 為 sub_two 的訂閱項目,並附加至 hello_topic。
gcloud pubsub subscriptions create sub_two --topic=hello_topic
建構一對多系統
下載發布者和訂閱者程式碼
下載本教學課程所需的 Pub/Sub Python 檔案。
git clone https://github.com/googleapis/python-pubsub.git
在繼續進行之前,請關閉任何開啟的終端機。
設定三個終端機
為每個教學課程應用程式啟動一個終端機 (一個發布者和兩個訂閱者)。為方便起見,本教學課程會將這些終端機稱為:
- 「publisher」終端機
- 「sub_one」終端機
- 「sub_two」終端機
在 publisher 終端機中,建立並啟用名為
pyenv-qs的 Python 虛擬環境。Bash
python -m venv pyenv-qs source pyenv-qs/bin/activate
PowerShell
py -m venv pyenv-qs .\pyenv-qs\Scripts\activate
在 sub_one 和 sub_two 終端機中,執行下列指令:
Bash
source pyenv-qs/bin/activate
PowerShell
.\pyenv-qs\Scripts\activate
執行啟用指令後,命令提示字元會包含下列值
(pyenv-qs) $。在「發布者」終端機中,使用
pip安裝 Pub/Sub Python 用戶端程式庫:python -m pip install --upgrade google-cloud-pubsub
在所有三個終端機中,使用目前的專案 ID 設定環境變數。這個 gcloud 指令會判斷您選取的專案 ID,並將其設為變數:
Bash
export PROJECT=`gcloud config get-value project`
PowerShell
$env:PROJECT=$(gcloud config get-value project)
在所有三個終端機中,變更為包含程式碼範例的專案路徑。
cd python-pubsub/samples/snippets/quickstart/
啟動應用程式並觀察訊息流程
啟動「Subscriber 1」(訂閱者 1) 應用程式
在 sub_one 終端機中,啟動「訂閱者 1」:
Bash
python sub.py $PROJECT sub_one
PowerShell
py sub.py $env:PROJECT sub_one
啟動後,這個應用程式會開啟與伺服器的雙向串流連線。Pub/Sub 會透過串流傳送訊息。

啟動「Publisher」(發布者) 應用程式
在「發布者」終端機中,啟動「發布者」應用程式:
Bash
python pub.py $PROJECT hello_topic
PowerShell
py pub.py $env:PROJECT hello_topic
發布商應用程式啟動後,Pub/Sub 系統會執行下列動作:
發布端應用程式會將「Hello, World!」訊息傳送至 Pub/Sub,但不會知道是否有任何現有訂閱項目。伺服器也會指派訊息 ID。
訂閱者 1 應用程式會收到「Hello, World!」訊息、列印該訊息,並將確認訊息傳送至 Pub/Sub。
發布商應用程式會列印確認訊息。確認訊息會告知 Pub/Sub 訊息已順利處理完畢,不必重新傳送給這個或任何其他 sub_one 訂閱者。
Pub/Sub 會從 sub_one 移除訊息。

啟動「Subscriber 2」(訂閱者 2) 應用程式
在 sub_two 終端機中,啟動「Subscriber 2」:
Bash
python sub.py $PROJECT sub_two
PowerShell
py sub.py $env:PROJECT sub_two
這個訂閱端會接收傳送至 sub_two 訂閱項目的訊息。
訂閱者 2 重複使用 sub.py 指令碼。不同之處在於,只有在發布端將訊息傳送至主題和訂閱項目後,才會啟動「訂閱者 2」。如果「發布商」直接呼叫「訂閱者 2」,發布應用程式就必須等待「訂閱者 2」出現,或必須逾時。Pub/Sub 會有效儲存訊息,供訂閱者 2 使用,藉此管理這個程序。

現在可以開始使用 Pub/Sub 進行開發了!
還順利嗎?
如需其他資源和連結,請前往 Pub/Sub 支援頁面。
清除所用資源
- 停止所有執行中的應用程式。
- 從本機環境刪除程式碼範例目錄。
刪除主題。
gcloud pubsub topics delete hello_topic
刪除訂閱項目。
gcloud pubsub subscriptions delete sub_one
gcloud pubsub subscriptions delete sub_two
在 Cloud de Confiance 控制台的「IAM 與管理」部分中,關閉教學課程專案。
-
選用:撤銷您建立的驗證憑證,並刪除本機憑證檔案。
gcloud auth application-default revoke
-
選用:從 gcloud CLI 撤銷憑證。
gcloud auth revoke
後續步驟
您可嘗試進行以下項目:
檢查本教學課程的
pub.py和sub.py程式碼,並瀏覽 GitHub 上的其他 Pub/Sub 範例。請練習建立每秒發布當地時間的pub.py版本。瞭解如何批次處理訊息。
使用推送訂閱項目接收訊息,觸發 App Engine 端點或 Cloud Functions。
使用 replay 擷取先前確認的訊息。根據預設,Pub/Sub 會從訂閱項目移除已確認的訊息。舉例來說,在本教學課程中,您無法重新執行
sub.py,再次收到「Hello, World!」訊息。透過重播功能設定訂閱項目後,您就能在訊息確認後接收訊息。開始使用其他語言的用戶端程式庫。