由于 PHP 5.5 版不再受社区支持,我们强烈建议新应用使用 PHP 7 运行时

创建推送队列

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

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

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

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

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

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

- name: queue-red
  rate: 1/s

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

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 以限制任务数,以及如何根据应用的需求和可用资源调整令牌桶大小和速率:

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

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

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

# 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 炸弹编程错误。

在 Cloud Console 中监控队列

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

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

    转到推送队列标签页

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

后续步骤