本页介绍如何将拉取队列代码从任务队列迁移到 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 客户端库:创建一个用于存储第三方库的目录,如
lib/
。mkdir lib
复制必要的库。
我们建议您使用
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
在
app.yaml
文件的libraries
部分指定 RPC 库:libraries: - name: grpcio version: 1.0.0
使用
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')
在使用 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 的引用。