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

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

导入 Cloud 客户端库

按照适用于安装客户端库的 Pub/Sub 说明,在您的应用中使用客户端库。

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

后续步骤