本页面介绍了使用 Cloud Tasks API 来管理队列与使用上传的 Cloud Tasks queue.yaml 文件来管理队列这二者之间有何区别。此外,还讨论了混合使用这两种机制的一些误区以及处理常见问题的方法。
简介
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 调用 CreateQueue 或 UpdateQueue,然后上传忽略了它们的 queue.yaml 文件,则在 Cloud Tasks 调用中创建的队列将被停用。
请考虑以下情况:
- 调用
CreateQueue以创建名为“cloud-tasks-queue”的队列。 上传一个包含以下内容的
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.yaml。Cloud Tasks 队列管理方法为用户提供了更多创建、更新和删除队列的选择。
但是,如果您当前使用的是 queue.yaml,则只有在了解与 Cloud Tasks 队列管理方法混合使用的误区 queue.yaml后,才应考虑改用队列管理方法。
为防止用户混用任务管理方法,一种方法是创建一个 Web 应用或命令行工具,所有用户都必须使用该工具来创建、更新和删除队列。该工具是使用 Cloud Tasks 队列管理方法还是 queue.yaml,这属于工具的实现细节,无需用户关注。如果用户必须使用该工具,则可以保证 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