任务队列概览

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

推送队列和拉取队列

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

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

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

拉取队列完全不分派任务。它们依靠其他工作器服务主动从队列中“租用”任务。拉取队列可让您拥有更大的掌控力和灵活性,使您可以选择处理任务的时间和地点,但同时也需要您完成更多流程管理事务。当某任务被租用时,租用工作器会声明一个截止期限。工作器必须在截止期限到来之前完成该任务并将其删除,否则任务队列服务将允许其他工作器租用该任务。

提示:在某些情况下,Google Cloud Pub/Sub 是拉取队列的出色备用方案。

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

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

用例

推送队列

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

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

拉取队列

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

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Java 版 App Engine 标准环境