使用队列管理与 queue.yaml 的对比

本页面介绍了使用 Cloud Tasks API 来管理队列与使用上传的 Cloud Tasks queue.yamlqueue.xml 文件来管理队列这二者之间有何区别。此外,还讨论了混合使用这两种机制的一些误区以及处理常见问题的方法。

简介

Cloud Tasks API 为 App Engine 任务队列服务提供独立于 App Engine 的界面。作为该界面的一部分,它提供了管理队列的功能,包括通过控制台或 gcloud 命令执行此操作。可以从 App Engine SDK 访问由 Cloud Tasks API 创建的队列,反之亦然。为了保持兼容性,可以使用 App Engine SDK queue.yaml 所使用的配置文件来创建和配置要通过 Cloud Tasks API 使用的队列。但是,通过 Cloud Tasks API 将配置通过文件与配置混合使用可能会产生意外后果。

queue.yaml 与 Cloud Tasks 队列管理方法混合使用的误区

对于底层服务,queue.yaml 文件是决定性的。如果上传一个忽略了项目中现有队列的 queue.yaml,那么无论队列是如何创建的,都会导致这些队列被停用或暂停。因此,如果您使用 Cloud Tasks API 调用 CreateQueueUpdateQueue,然后上传忽略了它们的 queue.yaml 文件,则在 Cloud Tasks 调用中创建的队列将被停用。

请考虑以下情况:

  1. 调用 CreateQueue 以创建名为“cloud-tasks-queue”的队列。
  2. 上传一个包含以下内容的 queue.yaml 文件:

    queue:
    - name: queue-yaml-queue
    

这个项目中队列的当前状态是什么?名为“cloud-tasks-queue”的队列和之前存在的任何其他队列都处于 DISABLED 状态,名为“queue-yaml-queue”的队列处于 RUNNING 状态。

如果您通过 Cloud Tasks API 创建队列,这种行为可能让人感到意外。以下说明介绍了如何恢复已停用的队列

同样,如果一个队列在 Cloud Tasks API 中被停用,但后来出现在上传的 queue.yaml 文件中,则该队列已恢复。

如果使用 DeleteQueue 方法删除的队列稍后显示在 queue.yaml 文件中,则 queue.yaml 上传可能会失败,因为在队列删除后几天内不允许重用队列名称。

最佳做法

如果您不熟悉 Cloud Tasks 或 App Engine,请仅使用 Cloud Tasks API 来管理队列,并避免同时使用 queue.yamlqueue.xml。Cloud Tasks 队列管理方法为用户提供了更多创建、更新和删除队列的选择。

但是,如果您当前使用的是 queue.yamlqueue.xml,则只有在了解与 Cloud Tasks 队列管理方法混合使用的误区 queue.yaml 后,才应考虑改用队列管理方法。

为了强制性地仅使用一种配置方法,请考虑使用群组和权限来控制对队列管理活动的访问权限。如需了解详情,请参阅保障队列配置

调试

您可以检查项目的管理活动审核日志,以检索队列配置更改的历史记录,包括队列创建、更新和删除:

    gcloud logging read \
      'protoPayload.methodName=
       (com.google.appengine.legacy.queue_created OR
        com.google.appengine.legacy.queue_updated OR
        google.cloud.tasks.v2.CloudTasks.CreateQueue OR
        google.cloud.tasks.v2.CloudTasks.UpdateQueue OR
        google.cloud.tasks.v2.CloudTasks.DeleteQueue)'

例如,如果现有队列被 queue.yaml 上传停用,则审核日志中会通过 com.google.appengine.legacy.queue_updated 方法显示“已禁用队列”“[QUEUE_NAME]”消息。

如何恢复因上传的 queue.yaml 而被停用的队列

如果您queue.yaml 与 Cloud Tasks 队列管理方法混合使用,则上传 queue.yaml 文件可能会意外停用通过 Cloud Tasks API 创建的队列。

如需恢复队列,您可以对队列调用 ResumeQueue 或将其添加到 queue.yaml 并上传。请注意,如果您之前在队列的 queue.yaml 配置中设置了自定义处理 rate,则 ResumeQueue 会将队列重置为默认 rate。这会反映在对 ResumeQueue 的响应的 maxDispatchesPerSecond 字段中。

配额

如果您使用 queue.yaml 创建队列,则默认最多可以创建 100 个队列。使用 Cloud Tasks API 创建的队列默认包含的队列上限是 1000 个。与在其他情况下一样,混合使用 queue.yaml 和 Cloud Tasks API 方法可能会产生意外结果。例如,假设您使用 queue.yaml 创建一些队列,然后将配额增加到 2000。如果您随后使用 Cloud Tasks API 方法创建更多队列,则会遇到配额错误。如需解决此问题,请通过 Cloud Console 的“配额”页面通过修改配额提交请求。

有关 Cloud Tasks 队列管理方法的其他信息

队列配置和队列启动延迟

对队列配置的更改可能需要几分钟才能生效。例如,在调用 CreateQueueUpdateQueue 时,可能会经过几分钟才能成功调用该队列上的 CreateTask

Cloud Tasks 和 default App Engine 队列

名为 default 的 App Engine 队列在 App Engine SDK 和 Cloud Tasks API 中会进行特殊处理。

如果 default 队列尚不存在,则在以下情况下创建该队列:

  1. 使用 App Engine SDK 首次将任务添加到 default 队列时。
  2. 上传指定 default 队列的 queue.yaml 文件时。
  3. 调用 CreateQueueUpdateQueue 用于创建 default 队列时。

为了保持与 App Engine 的兼容性,Cloud Tasks 强制执行以下限制:

  1. 如果创建名为“default”的队列,则它必须是使用 App Engine 任务的队列。
  2. 创建队列后,用户无法删除 default 队列。

Cloud Tasks API 中,以下内容也适用于 default 队列:

  1. Cloud Tasks API 不会自动创建 default 队列或任何其他队列。
  2. 就像任何其他队列一样,如果在创建队列之前调用队列,则在 default 队列上调用 GetQueue 会导致出现“未找到”错误。
  3. 同样,default 队列在创建前不会出现在 ListQueues 的输出中。
  4. 您可以使用 UpdateQueue 调用更改 default 队列的配置。

后续步骤