将拉取队列迁移到 Pub/Sub

本页介绍如何将拉取队列代码从任务队列迁移到 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 请求配额

迁移之前

本部分介绍在将拉取队列迁移到 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

导入 Python 客户端库

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

  1. 创建一个用于存储第三方库的目录,如 lib/

    mkdir lib
  2. 复制必要的库。

    我们建议您使用 pip 需求文件,而不是从命令行逐个安装这些库。如果您还没有 requirements.txt 文件,请在 app.yaml 文件所在的文件夹中创建一个 requirements.txt 文件。添加以下行:

    google-cloud-pubsub
    

    使用带有 -t <directory> 标志的 pip(版本 6 或更高版本)将您在 requirements.txt 文件中指定的 Pub/Sub 库复制到您在上一步中创建的文件夹。例如:

    pip install -t lib -r requirements.txt
    
  3. app.yaml 文件的 libraries 部分指定 RPC 库:

    libraries:
    - name: grpcio
      version: 1.0.0
    
  4. 使用 pkg_resources 模块来确保您的应用使用正确的 Pub/Sub Python 客户端库。

    如果您还没有 appengine_config.py 文件,请在 app.yaml 文件所在的文件夹中创建此文件。将以下内容添加到 appengine_config.py 文件:

    # appengine_config.py
    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')
    
  5. 在使用 Task Queues API 中的拉取队列的任何文件中导入 Pub/Sub Python 客户端库:

    from google.cloud import pubsub_v1

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 的引用。

后续步骤