创建推送队列

本页介绍如何创建和自定义推送队列,以及如何检查队列的内容。

使用队列配置文件创建队列

要处理任务,您必须将其添加到推送队列。App Engine 提供了一个名为 default 的默认推送队列,该队列已预先配置默认设置,可直接使用。如果您喜欢,可以将所有任务都添加到默认队列,而不必创建和配置其他队列。

如需添加队列或更改默认配置,请修改应用的队列配置文件,并将其上传到 App Engine。您最多可以创建 100 个队列。队列无法动态创建。

下面的队列配置文件定义了两个队列:

appcfg/xml

<?xml version="1.0" encoding="UTF-8"?>
  <queue-entries>
    <queue>
      <name>queue-blue</name>
      <target>v2.task-module</target>
    </queue>
    <queue>
      <name>queue-red</name>
      <rate>1/s</rate>
    </queue>
  </queue-entries>
  ```

gcloud/yaml

 queue:
 - name: queue-blue
   target: v2.task-module
   rate: 5/s

 - name: queue-red
   rate: 1/s

如需上传文件,请运行以下命令:

appcfg/xml

Mac/Linux:

    [PATH_TO_APP_ENGINE_SDK]\bin\appcfg.sh update [YOUR_APP_DIR]

Windows:

    [PATH_TO_APP_ENGINE_SDK]\bin\appcfg.cmd update [YOUR_APP_DIR]

gcloud/yaml

gcloud app deploy queue.yaml

添加到 queue-blue 的所有任务都将发送到目标模块 v2.task-modulequeue-red 的刷新率从每秒 5 个变为每秒 1 个。任务将以每秒 1 个的速率移出队列并发送到目标。

如果删除队列,则必须等待大约 7 天才能创建使用同一名称的新队列。

此外,您还可以将许多其他参数添加到配置文件中,以自定义推送队列的行为。如需了解详情,请参阅队列配置文件参考

定义推送队列处理速率

您可以通过定义其他指令(如 ratebucket_sizemax_concurrent_requests)来控制每个队列中任务的处理速率。

任务队列使用令牌桶来控制任务执行速率。每个命名队列都有一个用于存储令牌的令牌桶(其最大容量由 bucket_size 指定),如果未指定桶大小,则最多可存储 5 个令牌。

应用每执行一个任务,系统就会从桶中移除一个令牌。 应用会继续处理队列中的任务,直到该队列的桶中的令牌用完为止。App Engine 会按照您为队列指定的 rate 不断向令牌桶中补充新令牌。

如果您的队列包含要处理的任务,并且队列的桶包含令牌,则 App Engine 会同时处理与令牌同样多的任务。 这可能导致处理量暴增,不仅消耗系统资源还会与用户服务请求争用资源。

若要避免一次运行太多任务或数据存储区争用,请使用 max_concurrent_requests

以下示例展示了如何设置 max_concurrent_requests 以限制任务数,以及如何根据应用的需求和可用资源调整令牌桶大小和速率:

appcfg/xml

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <queue>
    <name>queue-blue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

gcloud/yaml

queue:
- name: queue-blue
  rate: 20/s
  bucket_size: 40
  max_concurrent_requests: 10

设置所有队列的存储空间上限

您可以使用队列配置文件定义所有队列中的任务数据可使用的总存储空间量。如需定义总存储空间上限,请在顶层添加一个名为 total_storage_limit 的元素:

appcfg/xml

<?xml version="1.0" encoding="UTF-8"?>
<queue-entries>
  <total-storage-limit>120M</total-storage-limit>
  <queue>
    <name>queue-blue</name>
    <rate>35/s</rate>
  </queue>
</queue-entries>

gcloud/yaml

# Set the total storage limit for all queues to 120MB
total_storage_limit: 120M
queue:
- name: queue-blue
  rate: 35/s

该值由一个数字后跟一个单位组成:B 表示字节、K 表示千字节、M 表示兆字节、G 表示千兆字节、T 表示太字节。例如,100K 指定上限为 100 千字节。如果添加任务会导致队列超过其存储空间上限,则引发添加该任务的调用将失败。免费应用的默认上限为 500M(500 兆字节)。对于付费应用,除非您明确设置,否则没有上限。您可以使用此上限来保护您的应用,以免发生 Fork 炸弹编程错误;一旦发生此类错误,每个任务在执行期间,都会添加多个其他任务。

如果您的应用在添加任务时收到配额不足的错误,只需调高总存储空间上限即可。如果您使用此功能,我们强烈建议您根据数日内执行任务所需的存储空间来设置上限。这样队列总有临时后盾,并可在处理积压任务时继续接受新任务,同时仍能够防范 Fork 炸弹编程错误。

配置最大并发请求数

您可以设置 max_concurrent_requests 来限制可以同时执行的任务数,从而控制处理速率。

如果应用队列的处理速率为每秒 20 个,且令牌桶大小为 40,那么该队列中的任务将以每秒 20 个的速率执行,并可在任务激增时短时间内提升至每秒 40 个。如果任务延迟时间相对较短,则这些设置会很有效;但是,如果延迟时间大幅增加,那么最终需要处理的并发任务也将明显增多。这种额外的处理负载可能会耗用额外的实例,并降低应用的处理速度。

例如,假设正常任务延迟时间为 0.3 秒。在此延迟时间下,最多需要同时处理约 40 个任务。但是,如果任务延迟时间增加至 5 秒,那么需要同时处理的任务很容易超过 100 个。这一增长会迫使应用使用更多实例处理额外的任务,从而可能降低整个应用的处理速度并干扰用户请求。可通过将 max_concurrent_requests 设置为较低值来避免这种可能。

例如,如果将 max_concurrent_requests 设置为 10,我们的示例队列会在延迟为 0.3 秒时维护大约 20 个任务/每秒的处理速率。当延迟时间增加至超过 0.5 秒时,此设置会限制处理速率,以确保同时运行的任务不超过 10 个。

appcfg/xml

<?xml version="1.0" encoding="utf-8"?>
<queue-entries>
  <queue>
    <name>optimize-queue</name>
    <rate>20/s</rate>
    <bucket-size>40</bucket-size>
    <max-concurrent-requests>10</max-concurrent-requests>
  </queue>
</queue-entries>

gcloud/yaml

 queue:
 - name: optimize-queue
   rate: 20/s
   bucket_size: 40
   max_concurrent_requests: 10

在 Cloud Console 中监控队列

Cloud Console 中的“任务队列”页面会显示有关应用中所有任务队列的信息。

  1. 访问 Cloud Console 中的“任务队列”页面,然后在页面顶部的菜单栏中选择“推送队列”标签页。

    转到推送队列标签页

  2. 推送队列标签列出了应用中的所有队列。点击队列名称将打开任务队列详细信息页面,您可以在其中查看所选队列中的所有任务。

后续步骤