通过升级到最新 SDK (Java) 将推送队列迁移到 Cloud Tasks

在升级到最新版 App Engine 服务 SDK 之前,请先查看 迁移概览

您可以将 App Engine 服务 SDK 更新到最新版本,以自动迁移到 Cloud Tasks。升级后,SDK 会自动将 PushQueue 调用重定向到 Cloud Tasks 前端 API。Cloud Tasks 会保留您现有的任务队列和任务,因此无需进行额外的迁移。

在后台,更新后的 SDK 使用 Cloud Tasks API 来保持与任务队列功能的对等性,该 SDK 支持以下功能:

  • 批量创建任务:SDK 使用批量 API 来支持在一次调用中添加最多 100 个任务。
  • 任务级重试:SDK 支持特定于任务的重试配置。
  • 事务性任务:SDK 在 Datastore 事务中将任务加入队列。如需保持可靠性,请创建或修改 cron.yaml 文件。

价格和配额

将推送队列迁移到 Cloud Tasks 可能会影响应用的价格和配额。

价格

在迁移之前,请查看 Cloud Tasks 价格 以估算您的每月费用。

与任务队列类似,使用 Cloud Tasks 推送目标向 App Engine 应用发送请求是免费的。不过,与任务队列不同的是,Cloud Tasks 会对执行的操作收费,例如创建、删除或管理任务。与免费的 App Engine 任务队列相比,这可能会导致每月总费用更高。

配额

Cloud Tasks 请求也会计入 App Engine 请求配额。

与任务队列一样,Cloud Tasks 具有 特定于服务的 配额。迁移到 Cloud Tasks 可能会更改您的配额。

准备工作

以下部分讨论了在将推送队列迁移到 Cloud Tasks 之前需要考虑的费用和配额。

  1. 确保您有权访问 App Engine 源代码。

  2. 启用 Cloud Tasks 和 Cloud Scheduler API:

    启用 API

  3. 如需确保 App Engine 服务帐号具有让 SDK 将任务调度到 Cloud Tasks API 所需的 权限,请让 您的管理员向该账号授予项目的 Cloud Tasks Enqueuerroles/cloudtasks.enqueuer)IAM 角色。

更新 App Engine 服务 SDK

  1. 确保您的应用使用最新版 App Engine 服务 SDK。

    pom.xml 中,将 App Engine 服务 SDK 更新到 v5.2.0-beta 或更高版本。

    
        com.google.appengine
        appengine-api-1.0-sdk
        v5.2.0-beta
    
  2. 启用 Cloud Tasks 路由

    runtime: java25
    service: my-service-b
    
    env_variables:
      APPENGINE_USE_CLOUDTASK_PUSH_QUEUE: "true"
    

    pom.xml 中,将 App Engine SDK 依赖项更新到 v5.2.0-beta 或更高版本。

    如果您的应用使用 XML 配置 (appengine-web.xml):

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <service>my-java-service-b</service>
      <runtime>java25</runtime>
      <env-variables>
        <env-var name="APPENGINE_USE_CLOUDTASK_PUSH_QUEUE" value="true" />
      </env-variables>
    </appengine-web-app>
    
  3. 部署应用:

    gcloud app deploy
    
  4. 在 Cloud Tasks 中验证推送队列 以验证您的应用是否正在使用 Cloud Tasks。

配置事务性任务(可选)

如果您的应用在 Datastore 事务中将任务加入队列,则 SDK 依赖于内部 Cron 作业,以确保在 Datastore 提交期间未能加入队列的任何任务最终都会得到处理。

如需处理推送队列事务性任务,请创建或更新 cron.yaml 文件以定期调用内部处理器。例如:

cron:
- description: "Process push queue transactional tasks"
  url: /_ah/cloudtask/sweep
  schedule: every 30 minutes # Change this based on the usage pattern

web.xml 文件中为 utils.servlet.SweeperServletutils.servlet.jakarta.SweeperServlet(适用于 Java 17/21 Jakarta EE 运行时)添加网址映射。

<servlet>
 <servlet-name>cloudtask_sweep</servlet-name>
 <servlet-class>com.google.apphosting.utils.servlet.SweeperServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>cloudtask_sweep</servlet-name>
 <url-pattern>/_ah/cloudtask/sweep</url-pattern>
</servlet-mapping>

后续步骤