本页介绍如何将拉取队列代码从任务队列迁移到 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 客户端库:
更新
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
文件中的不必要行。更新
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
文件夹,请删除它。对于 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')
在使用 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 的引用。
后续步骤
- Pub/Sub 文档
- 迁移推送队列
- 如需查看实操教程,请参阅从 App Engine 任务队列拉取队列迁移到 Pub/Sub Codelab。