配置 Cloud Tasks 队列

本页面介绍如何使用 Google Cloud CLI 的 gcloud 命令配置 Cloud Tasks 队列

概览

您可以在创建队列时或之后的任何时间配置 Cloud Tasks 队列,该配置将应用于该队列中的所有任务。

配置队列需要注意三个基本方面:

队列级路由

在队列级别配置路由会覆盖在任务级别设置的路由。 如果要将 Cloud Tasks 用作目标服务前面的缓冲区,或者需要更改队列中所有任务的路由,这会非常有用。

队列级路由适用于:

  • 当前在队列中的任务
  • 在设置队列级路由后添加到队列中的任务

限制

队列级路由与 Cloud Key Management Service (Cloud KMS) 客户管理的加密密钥 (CMEK) 不兼容。如果启用了 CMEK,您将无法执行以下操作:

  • 在具有队列级路由的队列中创建任务
  • 应用队列级路由

为 HTTP 任务配置队列级路由

应用队列级路由

您可以在创建队列或更新队列时,将队列配置为替换任务级路由。如需配置队列级路由,请将队列的 uriOverride 参数设置为您的首选路由。如果要将队列级路由作为更新应用于现有队列,请在应用更改之前暂停队列,并在应用更改后等待一分钟以恢复队列。新配置最多可能需要一分钟才能生效,因此等待恢复队列有助于防止任务分派旧配置。

更新或移除队列级路由

  1. 暂停队列。

    控制台

    如需使用 Google Cloud 控制台暂停队列,请执行以下操作:

    1. 在控制台打开 Cloud Tasks 队列页面。

      转到 Cloud Tasks 队列页面

    2. 选择要暂停的队列的名称,然后点击暂停队列

    3. 确认该操作。

    gcloud

    gcloud tasks queues pause QUEUE_ID
    

    QUEUE_ID 替换为您的队列 ID。

  2. 更新或移除队列级路由。

    • 如需更新队列级路由,请将 uriOverride 参数设置为更新后的路由。

    • 如需使用 REST 或 RPC API 移除队列级别路由,请执行以下操作:

      • REST API:针对载荷为空且 updateMask 参数设置为 httpTarget 的队列发送 patch 请求。

      • 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:您的访问令牌。您可以在终端运行以下命令来获取该值:

      1. gcloud auth application-default login
      2. gcloud auth application-default print-access-token
    • NEW_HOST:您希望队列路由到的新主机。

  3. 等一分钟。

    新配置最多可能需要一分钟才能生效,因此等待队列恢复有助于防止任务分派旧配置。

  4. 恢复队列。

    控制台

    如需使用 Google Cloud 控制台恢复队列,请执行以下操作:

    1. 在控制台打开 Cloud Tasks 队列页面。

      转到 Cloud Tasks 队列页面

    2. 选择要暂停的队列的名称,然后点击恢复队列

    3. 确认该操作。

    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:队列的位置

后续步骤