建構一對多的 Pub/Sub 系統

本教學課程會逐步說明如何設定一組應用程式,透過 Pub/Sub 傳送訊息進行通訊,而非同步 RPC。透過解除應用程式與訊息的耦合,您可以:

  • 可讓應用程式更穩定可靠
  • 可能可以簡化開發

舉例來說,呼叫端 (發布者) 不需要接收端 (訂閱者) 處於運作狀態且可用。發布者將訊息傳送至 Pub/Sub。 發布商不需要知道哪些訂閱端應用程式需要接收訊息,也不需要知道數量。因此,只要一或多個訂閱端應用程式可用,這項服務就能將訊息傳送給這些應用程式。

系統總覽

在本教學課程中,您會啟動發布者應用程式,使用一對多通訊方式,將「Hello, World!」訊息傳送給兩位訂閱者,如下圖所示:

主題、附加的訂閱項目,以及傳送訊息至 Cloud Pub/Sub 和從中接收訊息的發布端和訂閱端應用程式示意圖

兩個訂閱者應用程式使用相同程式碼,但您可於不同時間啟動。這個程序說明 Pub/Sub 如何啟用非同步通訊。如要建構這個系統,請完成下列步驟:

  1. 建立 IAM 服務帳戶,供應用程式用於驗證。
  2. 設定 IAM 權限。
  3. 建立 Pub/Sub 主題和訂閱項目。
  4. 啟動三個獨立應用程式:一個發布者及兩個訂閱者。

事前準備

  1. 安裝 Google Cloud CLI。

  2. 設定 gcloud CLI,使用您的聯合身分。

    詳情請參閱「使用聯合身分登入 gcloud CLI」。

  3. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  4. 建立或選取 Cloud de Confiance 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 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 專案名稱。

  5. 確認專案已啟用計費功能 Cloud de Confiance 。

  6. 如果尚未啟用,請啟用 Pub/Sub API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable pubsub.googleapis.com
  7. 為使用者帳戶建立本機驗證憑證:

    gcloud auth application-default login

    如果系統傳回驗證錯誤,且您使用外部識別資訊提供者 (IdP),請確認您已 使用聯合身分登入 gcloud CLI。

  8. 將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令: roles/pubsub.publisher, roles/pubsub.subscriber

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    更改下列內容:

安裝 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

建構一對多系統

下載發布者和訂閱者程式碼

  1. 下載本教學課程所需的 Pub/Sub Python 檔案。

     git clone https://github.com/googleapis/python-pubsub.git
  2. 在繼續進行之前,請關閉任何開啟的終端機。

設定三個終端機

  1. 為每個教學課程應用程式啟動一個終端機 (一個發布者和兩個訂閱者)。為方便起見,本教學課程會將這些終端機稱為:

    • 「publisher」終端機
    • 「sub_one」終端機
    • 「sub_two」終端機
  2. 在 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) $。

  3. 在「發布者」終端機中,使用 pip 安裝 Pub/Sub Python 用戶端程式庫:

    python -m pip install --upgrade google-cloud-pubsub
  4. 在所有三個終端機中,使用目前的專案 ID 設定環境變數。這個 gcloud 指令會判斷您選取的專案 ID,並將其設為變數:

    Bash

    export PROJECT=`gcloud config get-value project`

    PowerShell

    $env:PROJECT=$(gcloud config get-value project)
  5. 在所有三個終端機中,變更為包含程式碼範例的專案路徑。

    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 會透過串流傳送訊息。

訂閱者 1
  應用程式開始監聽 sub_one 訂閱項目的訊息。

啟動「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 移除訊息。

發布者應用程式會發布訊息並指派訊息 ID。Subscriber 1 應用程式會收到「Hello World」訊息,並傳送確認訊息

啟動「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 使用,藉此管理這個程序。

訂閱者 2 開始監聽,並接收 sub_two 中等待的訊息

現在可以開始使用 Pub/Sub 進行開發了!

還順利嗎?

如需其他資源和連結,請前往 Pub/Sub 支援頁面。

清除所用資源

  1. 停止所有執行中的應用程式。
  2. 從本機環境刪除程式碼範例目錄。
  3. 刪除主題。

    gcloud pubsub topics delete hello_topic
  4. 刪除訂閱項目。

    gcloud pubsub subscriptions delete sub_one
    gcloud pubsub subscriptions delete sub_two
  5. 在 Cloud de Confiance 控制台的「IAM 與管理」部分中,關閉教學課程專案。

  6. 選用:撤銷您建立的驗證憑證,並刪除本機憑證檔案。

    gcloud auth application-default revoke
  7. 選用:從 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!」訊息。透過重播功能設定訂閱項目後,您就能在訊息確認後接收訊息。

  • 開始使用其他語言的用戶端程式庫。