任务队列概览

本页面介绍何为任务队列,以及何时和如何使用它们。借助任务队列,应用可以在用户请求之外异步执行工作(即任务)。如果应用需要在后台执行工作,那么它会将任务添加到任务队列。这些任务稍后由工作器服务执行。

任务队列服务是专为异步工作设计的。它无法在任务交付时间上提供强有力的保证,因此不适合用户正在等待结果的交互式应用。

推送队列和拉取队列

任务队列有两种类型:推送队列和拉取队列。对于不同的队列,任务队列服务向工作器服务分派任务请求的方式是不同的。

推送队列通过向 App Engine 工作器服务传送 HTTP 请求来运行任务。它们会以可靠、稳定的速率分派这些请求,并保证任务能够可靠执行。由于您可以控制从队列发送任务的速率,因此可以控制工作器的调节行为,从而控制成本。

由于任务作为针对 App Engine 服务的请求来执行,因此它们需遵循严格的期限限制。由自动调节服务处理的任务必须在十分钟之内完成。由基本和手动调节服务处理的任务最长可运行 24 小时。

拉取队列完全不分派任务。它们依靠其他工作器服务主动从队列中“租用”任务。拉取队列提供更大的掌控力,让您能够更灵活地选择处理任务的时间和地点,但也要求您执行更严格的流程管理。当某任务被租用时,租用工作器会声明一个截止期限。工作器必须在截止期限之前完成该任务并将其删除,否则任务队列服务将允许其他工作器租用该任务。

所有任务队列任务都是异步执行的。创建任务的应用将任务移交给队列。原始应用不会收到关于任务是否完成或是否成功的通知。

如果工作器无法处理任务,则任务队列服务会为队列提供重试机制,以实现有限次数的任务重试。

使用场景

推送队列

推送队列的一种典型使用场景是“慢”操作。设想一下社交网络消息传递系统。每次用户发送消息时,网络都需要通知发送者的关注者。此操作可能非常耗时。借助推送队列,应用可以在每条消息到达时将该消息所对应的任务加入队列,以便将任务分派给工作器服务进行处理。当工作器收到任务请求时,它会检索发送者的关注者列表,并为每个关注者更新数据库。如果为每个数据库的更新将另一项推送任务加入队列,工作器的工作效率可以得到极大提高。

推送队列的另一个用途是计划任务。假设有一个用来实施广告活动的应用。可以将为发送电子邮件而编写的一组任务添加到推送队列中,并指示在指定的未来时间之前暂不执行这些任务。当到达预定日期时,任务队列服务将开始发出执行任务的请求。

拉取队列

如果您需要批处理任务以提高执行效率,拉取队列是不错的选择。一种解决方案利用了将标记附加到拉取任务的功能。工作器可以租用一组具有相同标记的任务。典型的例子包括维护着多种不同游戏排行榜的应用,这些游戏不断有许多玩家和团队参与。每次有新的高分记录诞生时,应用都可以将包含分数和玩家的拉取任务加入队列,并将游戏 ID 用作任务标记。工作器会定期“唤醒”,租用一组具有相同游戏 ID 的任务并更新排行榜。您可以使用指定的标记值明确租用任务,或是让服务决定发送哪一组具有类似标记的任务。

使用标记进行批处理的功能非常强大。由于标记可在应用运行时动态生成,因此工作器可以轻松地处理新的游戏 ID。

后续步骤