虽然您可以使用 queue.yaml
文件来管理队列,但混合使用队列管理
方法可能会导致意外结果。本指南介绍了混合使用这些方法的风险,并向您展示了如何解决常见的配置问题。
Cloud Tasks API 为 App Engine 任务队列服务提供独立接口。 借助此接口,您可以通过 Google Cloud 控制台或 Google Cloud CLI 管理队列。您使用 Cloud Tasks API 创建的队列可以从 App Engine SDK(一组特定于平台的 API、独立工具和运行时文件)访问,而使用 App Engine SDK 创建的队列可以从 Cloud Tasks API 访问。
为了保持兼容性,您可以使用 queue.yaml(App Engine SDK 的配置文件)为 Cloud Tasks API
创建和配置队列。但是,同时使用此文件和 Cloud Tasks API 管理队列可能会导致本指南中详述的问题。
准备工作
如果您不熟悉 Cloud Tasks 或 App Engine,请仅使用 Cloud Tasks API 来管理队列,并避免使用
queue.yaml。Cloud Tasks 队列管理方法为您提供了更多创建、更新和删除队列的选择。
如果您当前使用的是 queue.yaml,则只有在了解
混合使用队列管理方法的风险后,才应考虑改用
Cloud Tasks 队列管理方法。
强制执行队列管理方法
为防止混合使用队列管理方法,您可以创建用于创建、更新和删除队列的 Web 应用或命令行工具。该工具是使用 Cloud Tasks
队列管理方法还是 queue.yaml,这属于工具的实现细节,无需用户关注。通过强制使用该工具,您可以确保不会无意中混合使用方法。
向该工具授予
Cloud Tasks 队列管理员 Identity and Access Management (IAM)
角色,并要求用户进行身份验证。如需详细了解
访问权限管理,请参阅
保护队列配置。
队列配置延迟
队列配置更改可能需要几分钟才能生效。例如,在调用 CreateQueue 或 UpdateQueue
时,可能会经过几分钟才能成功调用该队列上的 CreateTask。
App Engine default 队列
名为 default 的 App Engine 队列在 App Engine SDK 和 Cloud Tasks API 中会进行特殊处理。
何时创建 default 队列? | |
|---|---|
如果 |
|
| Cloud Tasks 会强制执行哪些限制? | |
为了保持与 App Engine 的兼容性,
Cloud Tasks 会针对
|
|
混合使用队列管理方法的风险
对于底层服务,queue.yaml 文件是决定性的。如果上传一个忽略了项目中现有队列的
queue.yaml,那么无论队列是如何创建的,都会导致这些队列被停用或
暂停
。例如,如果您使用 Cloud Tasks API 调用
CreateQueue 或 UpdateQueue,然后上传一个忽略了这些队列的 queue.yaml 文件,则这些队列将被停用。然后,您需要
恢复已停用的队列。
混合使用队列管理方法可能会导致意外行为。例如,设想以下场景:
场景 1
您调用 CreateQueue 以创建名为 cloud-tasks-queue 的队列,然后上传包含以下内容的 queue.yaml 文件:
queue:
- name: queue-yaml-queue
这将导致以下队列状态:
- 名为
cloud-tasks-queue的队列和任何其他预先存在的队列都处于DISABLED状态。 - 名为
queue-yaml-queue的队列处于RUNNING状态。
场景 2
您使用 Cloud Tasks API 停用了一个队列,但该队列后来出现在上传的 queue.yaml 文件中。该队列已恢复。
场景 3
您使用 DeleteQueue 方法删除的队列后来出现在 queue.yaml 文件中。queue.yaml
上传可能会失败,因为
在队列删除后几天内不允许重用队列名称
。
使用审核日志进行调试
您可以检查项目的 管理员活动审核日志,并检索 队列配置更改的历史记录,包括队列创建、更新 和删除。
例如,如果 queue.yaml 上传停用了现有队列,您可以运行
以下命令,通过
Disabled queue QUEUE_NAME 方法返回
com.google.appengine.legacy.queue_updated 日志消息:
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 上传而被停用的队列
如果您混合使用队列管理方法,则上传 queue.yaml 文件
可能会意外停用通过 Cloud Tasks API 创建的队列。
如需恢复队列,您可以对队列调用 ResumeQueue,或将其添加到 queue.yaml 并上传。
如果您之前在 queue.yaml
配置中设置了自定义处理
rate,则 ResumeQueue 会将队列重置为默认 rate。这会
反映在
maxDispatchesPerSecond
对 ResumeQueue 的响应的字段中。
解决配额问题
如果您使用 queue.yaml 创建队列,则您的项目对可创建的最大队列数有默认配额
您可
创建的队列数。使用 Cloud Tasks API 创建的队列也有
默认配额。与在其他情况下一样,混合使用 queue.yaml 和 Cloud Tasks API
方法可能会产生意外结果。
例如,当您使用 queue.yaml 创建队列,然后收到配额增加通知时,如果您随后使用 Cloud Tasks API
创建其他队列,则可能会收到配额错误。如需解决此问题,您
可以使用 Google Cloud 控制台管理配额。如需了解详情,请参阅
使用控制台管理配额。