本教學課程將逐步介紹如何設定一組應用程式,以透過 Pub/Sub 傳送訊息的方式進行通訊,而非使用同步 RPC。透過解耦應用程式,訊息傳遞:
- 可讓應用程式更穩定可靠
- 可能可以簡化開發
例如呼叫端 (發布端) 不需要接收端 (訂閱端) 維持上線可用的狀態,發布者會將訊息傳送至 Pub/Sub。 發布者無須瞭解哪些及多少訂閱者應用程式需要接收訊息。因此,只要應用程式可用,您就能仰賴此服務將訊息傳送至一或多個訂閱者應用程式。
系統總覽
在本教學課程中,您會啟動發布端應用程式,使用一對多通訊方式將「Hello, World!」訊息傳送給兩個訂閱端,如下圖所示:
兩個訂閱者應用程式使用相同程式碼,但您可於不同時間啟動。這個程序說明 Pub/Sub 如何進行非同步通訊。如要建構這個系統,請完成下列步驟:
- 建立應用程式用於驗證的 IAM 服務帳戶。
- 設定 IAM 權限。
- 建立 Pub/Sub 主題和訂閱項目。
- 啟動三個獨立應用程式:一個發布者及兩個訂閱者。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
-
建立專案:如要建立專案,您需要具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 Pub/Sub API:
啟用 API 時所需的角色
如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。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。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
-
建立專案:如要建立專案,您需要具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 Pub/Sub API:
啟用 API 時所需的角色
如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。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。 例如:myemail@example.com。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) $。在 publisher 終端機中,使用
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」sub_one終端機中,啟動「Subscriber 1」:
Bash
python sub.py $PROJECT sub_one
PowerShell
py sub.py $env:PROJECT sub_one
啟動後,這個應用程式會開啟與伺服器的雙向串流連線。Pub/Sub 會透過串流傳送訊息。

啟動「Publisher」(發布者) 應用程式
在「publisher」終端機中,啟動「Publisher」(發布者) 應用程式:
Bash
python pub.py $PROJECT hello_topic
PowerShell
py pub.py $env:PROJECT hello_topic
發布者應用程式啟動後,Pub/Sub 系統會執行下列動作:
「Publisher」(發布者) 應用程式傳送「Hello, World!」訊息至 Pub/Sub 時,並不知道當下的訂閱狀況。伺服器也會指派訊息 ID。
「Subscriber 1」(訂閱者 1) 應用程式接收到「Hello World」訊息並進行輸出,然後傳送確認訊息至 Pub/Sub。
「Publisher」(發布者) 應用程式輸出確認訊息。確認訊息告知 Pub/Sub 訊息已成功處理,不需要再次傳送至此訂閱者或任何其他「sub_one」sub_one訂閱者。
Pub/Sub 會從 sub_one 移除訊息。

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

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