建構一對多 Pub/Sub 系統

本教學課程將逐步介紹如何設定一組應用程式,以透過 Pub/Sub 傳送訊息的方式進行通訊,而非使用同步 RPC。透過解除應用程式的耦合,訊息傳遞:

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

例如呼叫者 (發布者) 不需要接收者 (訂閱者) 維持上線可用的狀態,發布者會將訊息傳送至 Pub/Sub。 發布者無須瞭解哪些及多少訂閱者應用程式需要接收訊息。因此,只要應用程式可用,您就能仰賴此服務將訊息傳送至一或多個訂閱者應用程式。

系統總覽

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

圖示:主題及其附加訂閱,以及傳送訊息至 Cloud Pub/Sub 和從中接收訊息的發布者與訂閱者應用程式

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

  1. 建立應用程式用於驗證的身分與存取權管理 (IAM) 服務帳戶。
  2. 設定 IAM 權限。
  3. 建立 Pub/Sub 主題和訂閱項目。
  4. 啟動三個獨立應用程式:一個發布者及兩個訂閱者。

事前準備

  1. Install the Google Cloud CLI.

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

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

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

    gcloud init
  4. Create or select a Trusted Cloud project.

    • Create a Trusted Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Trusted Cloud project you are creating.

    • Select the Trusted Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Trusted Cloud project name.

  5. Verify that billing is enabled for your Trusted Cloud project.

  6. Enable the Pub/Sub API:

    gcloud services enable pubsub.googleapis.com
  7. Create local authentication credentials for your user account:

    gcloud auth application-default login

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

  8. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/pubsub.publisher, roles/pubsub.subscriber

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

    Replace the following:

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

    6. Optional: Revoke the authentication credentials that you created, and delete the local credential file.

      gcloud auth application-default revoke
    7. Optional: Revoke credentials from the gcloud CLI.

      gcloud auth revoke

    後續步驟

    您可嘗試進行以下項目:

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

    • 瞭解如何批次處理訊息

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

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

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