Fork me on GitHub

任务队列

任务队列负责管理后台工作,后台工作必须要在常规的 HTTP 请求-响应周期外执行。

任务队列为何是必要的?

任务需要异步执行的原因有两点:第一,它们并非由 HTTP 请求引发;第二,它们都是需要长时间运行并且会严重削弱 HTTP 响应性能的任务。

例如,某个 web 应用可以每 10 分钟去调用 GitHub API 来收集最受关注的 100 个仓库的名称。任务队列可以触发调用 GitHub API 的代码,然后处理返回的结果并存放在一个固定的数据库中,以便后期使用。

另外一个例子就是,在 HTTP 请求-响应周期中,当数据库查询需要花费太长时间时,就可以将查询任务放在后台执行,让它每隔一个固定时间就执行一次查询,并将结果存储在数据库中。当一个 HTTP 请求到来时,如果需要那些结果,只需要进行一次查询即可轻松地获取预先计算好的结果来,而不是再次执行长时间的查询任务。这种预先计算的情景就是一种在任务队列中启用 缓存 的例子。

其他需要任务队列的情形包括:

  • 将大量独立的数据库插入操作分开在一段时间内插入完成,而不是一次全部插入;

  • 在一个固定的时间间隔后收集一次数据值,例如每 15 分钟;

  • 安排周期性的工作,例如批处理。

任务队列的项目

Celery 是 Python 任务队列事实上的标准。其它任务队列项目的诞生往往是因为 Celery 在一些简单的案例中使用显得过于复杂。我的建议是将精力花费在 Celery 的合理学习曲线上,因为花费这些时间是值得的,它可以帮助理解如何使用这个项目。

  • 分布式任务队列 Celery 是最常使用的 Python 库,它用于执行异步任务和周期性任务。

  • RQ (Redis Queue) 是一个简单的 Python 库,用于给工作排队,并在后台处理它们。RQ 由 Redis 提供支持,并且学习门槛较低。 这篇 介绍文章 包含了 RQ 的设计决策以及如何使用它的相关信息。

  • Taskmaster 是一个简单的轻量级分布式任务队列,用于处理大量的一次性执行任务。

  • Huey 是一个简单的任务队列,由 Redis 提供后台支持,但除此之外并不依赖于其它库。这个项目是曾经知名的 Invoker,但是后来作者改名为 Huey 了。

  • Huey 是一个基于 Redis 的任务队列,旨在提供一个用于执行任务的简单灵活的框架。Huey 支持任务调度、类 crontab 的重复性任务执行、结果存储和在失败时自动重试等功能。

托管消息和任务队列服务

第三方任务队列服务旨在解决当扩展部署大量分布式任务队列时产生的问题。

  • Iron.io 是一个分布式消息服务平台,它可以和很多类型的任务队列配合工作,例如 Celery。它同样也是可以和其它 IaaS 和 PaaS 环境配合工作的,例如 Amazon Web 服务 和 Heroku。

  • Amazon 简单队列服务 (SQS) 是五种 API 的集合,分别用于创建、发送、接收、修改和删除消息。

  • CloudAMQP 是在它的核心管理服务器上安装并配置了 RabbitMQ。如果你正在使用 RabbitMQ,并且不想在你自己的服务器上维护 RabbitMQ 的安装,你可以选择这个服务。

使用任务队列的开源案例

  • 看看这个开放源码的 Flask 应用这个 Django 应用 例子,它们说明了如何使用并部署使用 Redis 作为代理中间件的 Celery 应用,从而使用这些框架发送消息。

  • flask-celery 例子 是一个简单的 Flask 应用,并且使用 Celery 作为任务队列,Redis 作为代理中间件。

任务队列相关资源

任务队列学习清单

  1. 从你的项目中选择一个在 HTTP 请求期间执行缓慢的函数。

  2. 确定你能否在一个固定的时间间隔中预先计算出结果,而不是在 HTTP 请求发生时再计算。如果可以的话,再在别处创建一个可以调用的函数,再将预先计算好的值存储到数据库中。

  3. 阅读 Celery 的文档以及相关资源一节列出的链接文章来理解这个项目是如何工作的。

  4. 安装一个消息代理中间件,如 RabbitMQ 或者 Redis,然后将 Celery 添加到你的项目中。配置 Celery 从而让它可以和安装的消息代理中间件一起工作。

  5. 使用 Celery 周期性地调用来自步骤一中的函数。

  6. 让 HTTP 请求函数使用预先计算好的值,而不是像它之前那样依赖运行缓慢的代码获得结果。

学完任务队列后再学习什么?

我如何对应用中出现的错误进行日志记录?

我想学习如何通过 Web 分析来了解用户的更多知识。

现有什么工具可以监控部署好的 web 应用?

在这里注册以便每月能收到一份邮件资料,内容包含本站的主要更新、教程和 Python 书籍的打折码等。