建構一對多的 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 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

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

    gcloud init
  5. 建立或選取 Google Cloud 專案

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

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

  6. 確認專案已啟用計費功能 Google Cloud

  7. 啟用 Pub/Sub API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

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

    gcloud auth application-default login

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

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

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

    更改下列內容:

    • PROJECT_ID:專案 ID。
    • USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com
    • ROLE:授予使用者帳戶的 IAM 角色。
  10. 安裝 Google Cloud CLI。

  11. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

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

    gcloud init
  13. 建立或選取 Google Cloud 專案

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

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

  14. 確認專案已啟用計費功能 Google Cloud

  15. 啟用 Pub/Sub API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

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

    gcloud auth application-default login

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

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

    gcloud 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

建構一對多系統

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

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

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

設定三個終端機

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

    • 「publisher」終端機
    • 「sub_one」終端機
    • 「sub_two」終端機
  2. publisher 終端機中,建立並啟用名為 pyenv-qsPython 虛擬環境

    Bash

    python -m venv pyenv-qs
    source pyenv-qs/bin/activate

    PowerShell

    py -m venv pyenv-qs
    .\pyenv-qs\Scripts\activate

    sub_onesub_two 終端機中,執行下列指令:

    Bash

    source pyenv-qs/bin/activate

    PowerShell

    .\pyenv-qs\Scripts\activate

    執行啟動命令後,命令提示字元會包含下列值 (pyenv-qs) $

  3. publisher 終端機中,使用 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」sub_one終端機中,啟動「Subscriber 1」

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

啟動後,這個應用程式會開啟與伺服器的雙向串流連線。Pub/Sub 會透過串流傳送訊息。

「Subscriber 1」(訂閱者 1) 應用程式開始聽取 sub_one 訂閱的訊息。

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

發布者應用程式發布訊息並指派訊息 ID。「Subscriber 1」(訂閱者 1) 應用程式接收「Hello World」訊息,並傳送確認訊息

啟動「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) 儲存此訊息,藉此管理這個程序。

「Subscriber 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. 在 Google Cloud 控制台的「IAM & admin」(IAM 與管理員) 區段關閉教學課程專案。

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

    gcloud auth application-default revoke
  7. 選用:從 gcloud CLI 撤銷憑證。

    gcloud auth revoke

後續步驟

您可嘗試進行以下項目:

  • 檢查教學課程的 pub.pysub.py 程式碼,並在 GitHub 上瀏覽其他 Pub/Sub 範例。您可建立每秒發布當地時間的 pub.py 版本做為練習。

  • 瞭解如何批次處理訊息

  • 使用推送訂閱來接收可觸發 App Engine 端點Cloud Functions 的訊息。

  • 使用重播擷取先前確認的訊息。 根據預設,Pub/Sub 會從訂閱項目移除已確認訊息。例如在本教學課程中,您無法重新執行 sub.py,再次接收「Hello, World!」訊息。重播功能可讓您設定訂閱,以接收確認後的訊息。

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