将拉取队列迁移到 Pub/Sub (Python)

本页介绍如何将拉取队列代码从任务队列迁移到 Pub/Sub。Pub/Sub 目前是在 App Engine 中执行拉取队列作业的首选方式。

如果应用同时使用了拉取队列和推送队列,请先按照本指南将拉取队列迁移到 Pub/Sub,然后再将推送队列迁移到新的推送队列服务 Cloud Tasks。不建议在将推送队列迁移到 Cloud Tasks 后迁移拉取队列,因为需要使用 queue.yaml 文件可能会导致 Cloud Tasks 出现意外行为。

Pub/Sub 中目前没有的功能

Pub/Sub 中目前还没有以下任务队列功能:

  • 按标记进行批处理
  • 自动删除重复信息

价格和配额

将您的拉取队列迁移到 Pub/Sub 可能会影响应用的价格和配额。

价格

Pub/Sub 有自己的价格。与任务队列一样,向使用 Pub/Sub 的 App Engine 应用发送请求可能会导致应用产生费用。

配额

Pub/Sub 配额与任务队列的配额不同。与任务队列一样,从 Pub/Sub 向 App Engine 应用发送请求可能会影响 App Engine 请求配额

迁移之前

如果尚未设置,请设置 Python 开发环境以使用与 Google Cloud 兼容的 Python 版本,并安装用于创建独立 Python 环境的测试工具。

以下部分讨论了在将拉取队列迁移到 Pub/Sub 之前的设置步骤。

启用 Pub/Sub API

如需启用 Pub/Sub API,请点击 API 库中 Pub/Sub API 上的启用。如果您看到的是管理按钮,而不是启用按钮,则说明您之前已为项目启用了 Pub/Sub API,因而无需再次执行此操作。

对应用进行身份验证以访问 Pub/Sub API

您必须对应用进行身份验证才能访问 Pub/Sub API。本部分介绍了针对两种不同使用场景的身份验证。

如需在本地开发或测试您的应用,建议您使用服务账号。如需了解如何设置服务账号并将其与应用关联,请参阅手动获取和提供服务账号凭据

如需在 App Engine 上部署应用,您不需要提供任何新的身份验证。应用默认凭据 (ADC) 会推断 App Engine 应用的身份验证详细信息。

下载 Google Cloud CLI

下载并安装 Google Cloud CLI 以便将 gcloud CLI 与 Pub/Sub API 搭配使用(如果您之前未安装过)。如果您已经安装 Google Cloud CLI,请从终端运行以下命令。

gcloud components update

导入 Cloud 客户端库

请按照以下步骤在现有 App Engine 应用中使用 Pub/Sub Python 客户端库:

  1. 更新 app.yaml 文件。 按照适用于您的 Python 版本的说明操作:

    Python 2

    对于 Python 2 应用,请添加最新版本的 grpcio 库。

    下面是一个 app.yaml 文件示例:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    

    Python 3

    对于 Python 3 应用,请在 app.yaml 文件中使用受支持的 Python 3 版本指定 runtime 元素。例如:

    runtime: python310 # or another support version
    

    Python 3 运行时会自动安装库,因此您无需指定过往 Python 2 运行时中的内置库。如果您的 Python 3 应用在迁移时使用其他旧版捆绑服务,您可以继续指定必要的内置库。否则,您可以删除 app.yaml 文件中的不必要行。

  2. 更新 requirements.txt 文件。 按照适用于您的 Python 版本的说明操作:

    Python 2

    将 Pub/Sub 的 Cloud 客户端库添加到 requirements.txt 文件中的依赖项列表。

    google-cloud-pubsub
    

    然后,运行 pip install -t lib -r requirements.txt 以更新应用的可用库列表。

    Python 3

    将 Pub/Sub 的 Cloud 客户端库添加到 requirements.txt 文件中的依赖项列表。

    google-cloud-pubsub
    

    App Engine 会在 Python 3 运行时的应用部署期间自动安装这些依赖项,因此如果存在 lib 文件夹,请删除它。

  3. 对于 Python 2 应用,如果您的应用使用内置库或复制的库,您必须在 appengine_config.py 文件(与 app.yaml 文件位于同一文件夹)中指定这些路径:

    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set PATH to your libraries folder.
    PATH = 'lib'
    # Add libraries installed in the PATH folder.
    vendor.add(PATH)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(PATH)
    

    上方的 appengine_config.py 文件假设当前工作目录是 lib 文件夹所在的位置。在某些情况下,比如单元测试,当前工作目录可能有所不同。为避免出错,您可以使用以下命令,将完整路径明确传递到 lib 文件夹:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
  4. 在使用 Task Queues API 中的拉取队列的任何文件中导入 Pub/Sub Python 客户端库:

    from google.cloud import pubsub

Pub/Sub 和拉取队列

特性比较

Pub/Sub 通过发布者/订阅者关系向工作器发送作业。Pub/Sub 中的拉取订阅类似于任务队列中的拉取队列,因为订阅者从主题拉取消息。下表列出了任务队列中拉取队列的核心功能,以及 Pub/Sub 中拉取订阅的关联功能。

任务队列功能 Pub/Sub 功能
队列 主题
任务 消息
工作器 订阅者

如需详细了解 Pub/Sub 架构,请参阅 Cloud Pub/Sub:Google 级消息传递服务

工作流比较

下面比较了任务队列中的拉取队列与 Pub/Sub 中的拉取订阅的典型工作流。

任务队列工作流 Pub/Sub 工作流
您创建拉取队列 您创建主题并使您的订阅者(即工作器)订阅该主题
您创建任务并将其加入队列 您创建消息并将其发布到主题
工作器租用任务 订阅者从主题中拉取消息
工作器处理任务 订阅者处理消息
工作器从队列中删除任务 订阅者确认消息
租用到期 当主题的所有订阅者都确认消息后,主题会删除该消息

在 Pub/Sub 中创建拉取订阅

您可以使用与任务队列拉取队列类似的 Pub/Sub 拉取订阅。主题的订阅不会过期,并且可以同时存在于多个工作器。这意味着消息可以由多个工作器处理,这是 Pub/Sub 的主要使用场景之一。如需重新创建任务队列拉取队列作为 Pub/Sub 拉取订阅,请为每个工作器创建一个主题,并仅为关联的工作器订阅相应主题。这样可以确保每则消息仅由一个工作器处理,就像在任务队列中一样。如需了解如何创建和管理拉取订阅,请参阅管理主题和订阅

删除拉取队列

将任务队列拉取队列迁移到 Pub/Sub 拉取订阅后,使用 queue.yaml 文件将其从任务队列中删除。我们建议您先删除每个已迁移拉取队列,然后再迁移下一个拉取队列。这样可以防止您的应用在您迁移其他拉取队列时,重复执行从新的 Pub/Sub 拉取订阅接收的作业。注意,相对于在一个部署中删除任务队列拉取队列,逐个将其删除可能会对 App Engine 部署配额产生更大的影响。

从任务队列中删除所有拉取队列后,您可以在日后部署应用时省略 queue.yaml 文件。

如果您的应用仅使用拉取队列,请在代码中移除对 Task Queues API 的任何引用。如果您的应用同时使用拉取队列和推送队列,您可以从仅使用拉取队列的文件中移除对 Task Queues API 的引用,也可以等到迁移推送队列之后,再从所有文件中移除对 Task Queues API 的引用。

后续步骤