本页面介绍如何使用 Google Cloud CLI 的 gcloud
命令配置 Cloud Tasks 队列。
概览
您可以在创建队列时或之后的任何时间配置 Cloud Tasks 队列,该配置将应用于该队列中的所有任务。
配置队列需要注意三个基本方面:
队列级路由
在队列级别配置路由会覆盖在任务级别设置的路由。如果您想将 Cloud Tasks 用作目标服务前的缓冲区,或者需要更改队列中所有任务的路由,这会非常有用。
队列级路由适用于:
- 当前在队列中的任务
- 在设置队列级路由后添加到队列中的任务
限制
队列级路由与 Cloud Key Management Service (Cloud KMS) 不兼容 客户管理的加密密钥 (CMEK)。如果启用 CMEK,您将无法执行以下操作:
- 在具有队列级路由的队列上创建任务
- 应用队列级转送
为 HTTP 任务配置队列级路由
应用队列级转送
您可以将队列配置为在创建
队列或更新队列时添加。如需配置队列级路由,请将队列的 uriOverride
参数设置为首选路线。如果您要将队列级路由作为
更新现有队列、暂停队列,然后再应用更改
应用更改后等待一分钟,以恢复队列。这可能需要占用
1 分钟后,新配置才会生效,因此,请等待
队列有助于防止任务使用旧配置进行分派。
更新或移除队列级路由
暂停队列。
控制台
如需使用 Google Cloud 控制台暂停队列,请执行以下操作:
在控制台打开 Cloud Tasks 队列页面。
选择要暂停的队列名称,然后点击暂停队列。
确认该操作。
gcloud
gcloud tasks queues pause QUEUE_ID
将
QUEUE_ID
替换为您的队列的 ID。更新或移除队列级路由。
要更新队列级路由,请将
uriOverride
参数添加到更新后的路线中如需使用 REST API 或 RPC API 移除队列级路由,请执行以下操作:
REST API:针对队列发送
patch
请求,其中载荷为空,并将updateMask
参数设为httpTarget
。RPC API:为队列发送
updateQueueRequest
,其中载荷为空,update_mask
参数设为http_target
。
以下示例使用 REST API 更新主机任务的路由 更改为:
curl -X PATCH -d @- -i \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID?updateMask=httpTarget.uriOverride" << EOF { "httpTarget": {"uriOverride":{"host":"NEW_HOST"}} } EOF
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目的 ID。 您可以在终端中运行以下命令来获取此信息:gcloud config get-value project
LOCATION
:您的队列位置。QUEUE_ID
:队列的 ID。ACCESS_TOKEN
:您的访问令牌。您可以通过以下方式获取 在终端中运行以下命令:gcloud auth application-default login
gcloud auth application-default print-access-token
NEW_HOST
:您希望队列路由到的新的主机。
等待一分钟。
新配置最长可能需要一分钟才能生效,因此等待恢复队列有助于防止任务使用旧配置调度。
恢复队列。
控制台
如需使用 Google Cloud 控制台恢复队列,请执行以下操作:
在控制台打开 Cloud Tasks 队列页面。
选择要暂停的队列的名称,然后点击恢复队列。
确认该操作。
gcloud
gcloud tasks queues resume QUEUE_ID
将
QUEUE_ID
替换为队列的 ID。
为 App Engine 任务配置队列级路由
如需为 App Engine 任务配置队列级路由,请将队列的 appEngineRoutingOverride
参数设置为首选的 App Engine 服务和版本。
要设置此非默认队列级路由和覆盖,请执行以下操作:
任何任务级路由,可以使用 gcloud
:
gcloud tasks queues update QUEUE_ID\ --routing-override=service:SERVICE,version:VERSION
替换以下内容:
SERVICE
:负责任务处理的 App Engine 工作器服务。VERSION
:应用版本。
例如,如果您设置了名为 SERVICE 的工作器服务来处理队列中的所有任务,则可以路由到该服务和默认版本:
gcloud tasks queues update QUEUE_ID \ --routing-override=service:SERVICE
描述队列:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
替换以下内容:
QUEUE_ID
:队列 ID(其简称)LOCATION
:队列的位置
输出应如下所示:
appEngineRoutingOverride: host: SERVICE.PROJECT_ID.appspot.com service: SERVICE name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID rateLimits: maxBurstSize: 100 maxConcurrentDispatches: 1000 maxDispatchesPerSecond: 500.0 retryConfig: maxAttempts: 100 maxBackoff: 3600s maxDoublings: 16 minBackoff: 0.100s state: RUNNING
移除了针对 App Engine 目标的队列级路由
移除队列级路由后,任务级路由会同时应用于任务 该队列当前在队列中,将来添加到该队列的任务。移除 队列级路由,请运行以下命令:
gcloud tasks queues update QUEUE_ID \ --clear-routing-override
定义速率限制
您可以设置队列可调度的并发任务的最大速率和数量。
gcloud tasks queues update QUEUE_ID \ --max-dispatches-per-second=DISPATCH_RATE \ --max-concurrent-dispatches=MAX_RUNNING
替换以下内容:
DISPATCH_RATE
:调度率(为 存储桶中令牌的刷新速率)。在任务流相对稳定的情况下,这相当于任务被分派的速率。MAX_RUNNING
:队列中可同时运行的任务的最大数量。
例如,如果您在没有设置任何参数的情况下创建了一个队列, 通过调用以下命令更新最大并发任务数:
gcloud tasks queues update QUEUE_ID \ --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
Describe
队列:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
替换以下内容:
QUEUE_ID
:队列 ID(其简称)LOCATION
:队列的位置
输出应如下所示:
name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID rateLimits: maxBurstSize: 100 maxConcurrentDispatches: MAX_CONCURRENT_DISPATCHES maxDispatchesPerSecond: 500.0 retryConfig: maxAttempts: 100 maxBackoff: 3600s maxDoublings: 16 minBackoff: 0.100s state: RUNNING
使用 gcloud
命令和 queue.yaml
定义处理速率
Cloud Tasks API 定义队列处理速率的方法与使用上传 queue.yaml
文件的方法略有不同,即使这两种方法导致队列使用相同的底层机制。
在这两种情况下,队列都使用令牌桶算法来控制任务执行速率。每个命名的队列都有一个用于存储令牌的存储分区。
应用每执行一个任务,系统就会从桶中移除一个令牌。
队列会继续处理任务,直到该队列的令牌桶中再也没有令牌为止。系统会按照您为队列指定的 max_dispatches_per_second
速率不断向令牌桶中补充填充新令牌。如果队列中有要处理的任务,并且队列的令牌桶中存在令牌,则系统同时处理的任务数量与令牌数量相同,最多不超过您设置的 max_concurrent_dispatches
值。
负载不平衡可能会导致存储分区中的令牌数量显着增加,这可能会在随后出现大量请求时导致导致处理量暴增。在这种情况下,您的队列可能会遇到超过 max_dispatches_per_second
速率的实际调度速率,这不仅消耗系统资源还会与用户服务请求争用资源。如果您使用队列管理基于相对较慢的下游服务 SLA 的调度速率,则会导致 HTTP 429
(请求过多)或 503
(服务不可用)等错误。
当您使用任意 Cloud Tasks API 方法时,您有两个字段来定义队列调度速率:
max_dispatches_per_second
max_concurrent_dispatches
第三个字段 max_burst_size
由系统根据您为 max_dispatches_per_second
设置的值进行计算。
当您使用 queue.yaml
方法时,可以设置以下全部三个元素:
max_concurrent_requests
,等于max_concurrent_dispatches
rate
,等于max_dispatches_per_second
bucket_size
,等于max_burst_size
在大多数情况下,使用 Cloud Tasks API 方法并让系统设置 max_burst_size
可以非常高效地管理请求爆发期。但在某些情况下,具体来说是当所需速率较慢时,可以使用 queue.yaml
方法将 bucket_size
手动设置为较小的值,或者通过 Cloud Tasks 将 max_concurrent_dispatches
设置为较小的值 API 来为您提供更多控制权。
设置重试参数
如果任务未成功完成,Cloud Tasks 将根据您设置的参数,使用指数退避算法重试该任务。您可以指定队列中失败任务的最大重试次数,设置重试尝试的时间限制,以及控制重试之间的时间间隔。
gcloud tasks queues update QUEUE_ID \ --max-attempts=MAX_ATTEMPTS \ --min-backoff=MIN_INTERVAL \ --max-backoff=MAX_INTERVAL \ --max-doublings=MAX_DOUBLINGS \ --max-retry-duration=MAX_RETRY_DURATION
替换以下内容:
MAX_ATTEMPTS
:任务尝试次数上限,包括 第一次尝试时发送。您可以将此标志设置为unlimited
来允许进行无限次重试。MIN_INTERVAL
:重试尝试之间的最短等待时间。 该值必须是以“s”结尾的字符串,如5s
。MAX_INTERVAL
:重试尝试之间等待的最长时间。该值必须是以“s”结尾的字符串,例如5s
。MAX_DOUBLINGS
:在增加量变为常量之前,失败任务重试之间的时间间隔将加倍的最大次数。MAX_RETRY_DURATION
:重试失败任务的最长时间(从首次尝试任务时算起)。通过 值必须是以“s”结尾的字符串,例如5s
。
验证您的队列已配置成功:
gcloud tasks queues describe QUEUE_ID --location=LOCATION
替换以下内容:
QUEUE_ID
:队列 ID(其简称)LOCATION
:队列的位置
后续步骤
- 了解如何创建 HTTP 目标任务。
- 了解如何创建 App Engine 任务。
- 了解如何设置 Cloud Logging
- 如需详细了解队列管理,请参阅 RPC API 参考文档。
- 参阅 REST API 参考,了解队列管理。
- 查看 Cloud Tasks
gcloud
命令的完整列表。