分布式任务队列Celery

来自CloudWiki
跳转至: 导航搜索

Celery简介

随着信息时代的持续发展,越来越复杂的业务需求对自动化运维的要求上了一个新的台阶,任务调度系统也由单一主机任务调度系统向分布式任务调度系统过渡。无论是业务层面的作业调度还是运维本身的作业调度需求,分布式的任务也越来越普及。本章将介绍一个非常优秀的开源分布式任务队列——Celery。Celery是一个简单、灵活且可靠的,可以处理大量消息的分布式系统,并且提供了维护这样一个系统的必需工具。它是一个专注于实时处理的任务队列,同时也支持任务调度


Celery是由纯Python编写的,但协议可以用任何语言实现。目前,已有Ruby实现的RCelery、Node.js实现的node-celery及一个PHP客户端,语言互通也可以通过using webhooks实现。在使用Celery之前,我们先来了解以下几个概念:

Celery概念

任务队列

任务队列:简单来说,任务队列就是存放着任务的队列,客户端将要执行任务的消息放入任务队列中,执行节点worker进程持续监视队列,如果有新的任务,就取出来执行该任务。这种机制就像生产者、消费者模型一样,客户端作为生产者,执行节点worker作为消费者,它们之前通过任务队列进行传递,

Python20-14-4.png

可以看到,Celery 主要包含以下几个模块:

任务模块 Task

 包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由 Celery Beat 进程周期性地将任务发往任务队列。

消息中间件 Broker

 Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery 本身不提供队列服务,官方推荐使用 RabbitMQ 和 Redis 等。

官方给出的实现broker的工具。

Python20-14-2.png

在实际使用中,我们选择RabbitMQ或Redis作为中间人。

任务执行单元 Worker

Worker 是执行任务的处理单元,它实时监控消息队列,获取队列中调度的任务,并执行它。

任务结果存储 Backend

Backend 用于存储任务的执行结果,以供查询。同消息中间件一样,存储也可使用 RabbitMQ, redis 和 MongoDB 等。

安装Celery

我们可以从Python Package Index(PyPI)安装或者使用源代码安装Celery,推荐使用pip安装。

使用pip安装

pip3 install celery -i https://pypi.tuna.tsinghua.edu.cn/simple

使用源代码安装

http://pypi.python.org/pypi/celery/)。

$ tar xvfz celery-0.0.0.tar.gz

$ cd celery-0.0.0

$ python setup.py build

$ python setup.py install #这里如果不是在virtualenv中安装,就需要使用root权限安装

Celery与Python3.7及以上的兼容性

https://www.cnblogs.com/breakcircle/p/12721335.html

报错”from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger”,

这是因为在 python 3.7 中将 async 作为了关键字,所以当 py 文件中出现类似 from . import async, base 这类不符合python语法的语句时,Python会报错;

解决方法: 在 celery 官方的提议下,建议将 kombu下的async.py 文件的文件名改成 asynchronous;然后把引用和这个文件的所有文件的里面的async改为asynchronous;

Python20-14-3.png

安装Redis

yum install wget gcc

wget http://download.redis.io/releases/redis-4.0.11.tar.gz

[root@localhost opt]# tar xzf redis-4.0.11.tar.gz

[root@localhost opt]# cd redis-4.0.11

[root@localhost redis-4.0.11]# make


make完后redis-4.0.11目录下会出现编译后的Redis服务程序redis-server,以及用于测试的客户端程序redis-cli,两个程序位于安装目录src目录下。

启动Redis服务

默认启动

cd src

./redis-server
84198:C 30 May 11:04:04.779 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
84198:C 30 May 11:04:04.780 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=841    98, just started
84198:C 30 May 11:04:04.780 # Warning: no config file specified, using the default config. In ord    er to specify a config file use ./redis-server /path/to/redis.conf
84198:M 30 May 11:04:04.780 * Increased maximum number of open files to 10032 (it was originally     set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 4.0.11 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 84198
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

根据配置文件启动

cd src

./redis-server ../redis.conf

redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

功能测试

启动Redis服务进程后,就可以使用测试客户端程序redis-cli和Redis服务交互了。例如:

[root@localhost redis-4.0.11]# cd src

[root@localhost src]# ./redis-cli

127.0.0.1:6379> set foo bar

OK

127.0.0.1:6379> get foo

"bar"

127.0.0.1:6379> set maxin good_teacher

OK

127.0.0.1:6379> get maxin

"good_teacher"

说明安装成功

配置Celery的BROKER_URL,Redis默认的连接URL如下:

BROKER_URL = 'redis://localhost:6379/0'

URL的格式为redis://:password@hostname:port/db_number。URL Scheme后的所有字段都是可选的,并且默认为localhost的6479端口,使用数据库0。