构建一对多 Pub/Sub 系统

本教程将指导您设置一组 即通过 Pub/Sub 发送消息 同步 RPC。通过分离应用,消息传递:

  • 使应用更稳健
  • 可以简化开发

例如,调用方(发布者)不需要接收方(订阅者) 保持在线状态发布者向 Pub/Sub 发送消息。 发布者不需要知道哪些订阅者应用以及应用数量 需要接收该消息。因此,该服务可以依赖于 将消息传递给一个或多个订阅方应用 可用。

系统概览

在本教程中,您将启动一个发布方应用, “Hello, World!”通过一对多通信向两个订阅者发送消息, 如下图所示:

主题、其相关订阅以及向 Cloud Pub/Sub 发送消息的发布者和从 Cloud Pub/Sub 接收消息的订阅者应用的示意图

这两个订阅者应用使用相同的代码,但您可以在不同的时间启动它们。此过程演示了 Pub/Sub 启用异步通信的方式。为了构建 您需要完成以下步骤:

  1. 创建一个 IAM 服务账号 用于身份验证。
  2. 设置 IAM 权限
  3. 创建 Pub/Sub 主题和订阅。
  4. 启动三个独立应用:一个发布者应用和两个订阅者应用

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

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

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

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

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. 确保您的 Google Cloud 项目已启用结算功能

  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
  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_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  9. Install the Google Cloud CLI.
  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

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

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. 确保您的 Google Cloud 项目已启用结算功能

  13. Enable the Pub/Sub API:

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

    gcloud auth application-default login
  15. 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_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual 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. 为每个教程应用(一个发布者应用和两个订阅者应用)启动一个终端。为方便起见,本教程调用了以下终端:

    • 发布者终端
    • sub_one 终端
    • sub_two 终端
  2. 在发布者终端中,创建并激活 Python 虚拟环境 名为 pyenv-qs

    Bash

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

    PowerShell

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

    在 sub_onesub_onesub_onesub_two 终端中,运行以下命令:

    Bash

    source pyenv-qs/bin/activate

    PowerShell

    .\pyenv-qs\Scripts\activate

    运行 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/

启动应用并观察消息流

启动订阅者 1 应用

在 sub_one 终端中,启动订阅者 1

Bash

python sub.py $PROJECT sub_one

PowerShell

py sub.py $env:PROJECT sub_one

启动后,此应用会打开与服务器之间的双向流式传输连接。Pub/Sub 通过数据流传送消息。

订阅者 1 应用开始侦听有关 sub_one 订阅的消息。

启动发布者应用

在发布者终端中,启动发布者应用:

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。订阅者 1 应用接收“Hello World”消息并发送确认。

启动订阅者 2 应用

在 sub_two 终端中,启动订阅者 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. 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!”消息。重放 功能可让您设置订阅,以便接收邮件 它们会得到确认

  • 开始使用其他语言的客户端库。