在 Go 中使用拉取队列

本页面简要介绍了 App Engine 标准环境中的拉取队列。

在推送队列中,系统会根据队列的配置将任务传送到工作器服务。在拉取队列中,工作器服务必须向队列请求任务。队列会做出响应,向该工作器授予在指定的时间段内处理任务的唯一访问权限,这称为“租用”。

应用将任务卸载到任务队列服务,然后工作器通过任务队列服务租用该任务

使用拉取队列,您还可以使用标记对相关任务进行分组,然后将工作器配置为一次性提取多个带有特定标记的任务。此过程称为“批处理”。

如果工作器在租用到期时未能处理某个任务,则可以进行续租或者让任务租用自动到期,此时其他工作器便可以租用该任务。完成与任务相关的工作后,工作器必须删除该任务。

如果使用拉取队列,则会要求您的代码处理一些在推送队列中自动执行的功能:

增减工作器
您的代码需要根据处理量来扩缩工作器的数量。如果您的代码无法实现扩缩,则在没有任务需要处理时,您可能会浪费计算资源;而如果有太多任务需要处理,您又可能会面临延迟风险。
删除任务
您的代码还需要在处理任务后明确删除任务。在推送队列中,App Engine 会为您删除任务。如果您的工作器在处理拉取队列任务后未删除相应任务,则另一个工作器将再次处理该任务。这会浪费计算资源;并且如果任务不具有幂等性,还会有出错的风险。

App Engine 标准环境中的拉取队列通过在名为 queue.yaml 的配置文件中设置属性来创建。

拉取队列工作流

从拉取队列处理任务的工作器,必须在运行于 App Engine 标准环境中的服务内加以定义。

工作流如下:

  1. 使用 queue.yaml 创建拉取队列
  2. 创建任务并将其添加到队列中。
  3. 您所创建的工作器使用 TaskQueue 租用任务
  4. App Engine 在租用响应中将任务数据发送给工作器。
  5. 工作器处理该任务。如果该任务在租用到期之前未能执行,则工作器可以修改租用时长。如果租用到期,则其他工作器将可以租用该任务。
  6. 成功处理任务后,工作器删除任务

后续步骤