Celery——分布式任务队列

Celery是一个Python编写的分布式系统,用于处理大量信息,支持实时任务处理和任务调度。它由消息中间件、任务执行单元(worker)和任务结果存储三部分构成,可与RabbitMQ、Redis等消息代理集成。Celery适用于Web应用异步任务、定时任务管理和分布式任务队列。通过使用RabbitMQ作为消息代理,Msgpack做序列化,并选择Redis作为结果存储,可以构建高效稳定的Celery应用。
摘要由CSDN通过智能技术生成

目录

Celery概述

Celery架构

Celery应用场景

Celery特性

消息代理

Celery序列化

从一个简单的例子开始

进阶用法


Celery概述

Celery 是一个由 Python 编写的简单、灵活、可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具。

Celery 专注于实时任务处理,支持任务调度。所谓任务就是消息,消息中的有效载荷包含要执行任务需要的全部数据。

我们可以把Celery看作是一个分布式队列的管理工具,使用 Celery可以快速实现并管理一个分布式的任务队列。

Celery架构

è¿éåå¾çæè¿°

Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, RedisMongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache

Celery应用场景

1. Web应用。当用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给Celery去异步执行,执行完再返回给用户。这段时间用户不需要等待,提高了网站的整体吞吐量和响应时间。

2. 定时任务。生产环境经常会跑一些定时任务。假如你有上千台的服务器、上千种任务,定时任务的管理很困难,Celery可以帮助我们快速在不同的机器设定不同种任务。

3. 同步完成的附加工作都可以异步完成。比如发送短信/邮件、推送消息、清理/设置缓存等。

Celery特性

1. 方便地查看定时任务的执行情况,比如执行是否成功、当前状态、执行任务花费的时间等。

2. 可以使用功能齐备的管理后台或者命令行添加、更新、删除任务。

3. 方便把任务和配置管理相关联。

4. 可选多进程、Eventlet和Gevent三种模式并发执行。

5. 提供错误处理机制。

- 提供多种任务原语,方便实现任务分组、拆分和调用链。

- 支持多种消息代理和存储后端。

消息代理

Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis,至于其他的方式,一是支持有限,二是可能得不到更好的技术支持。

Celery官方推荐的是RabbitMQ,Celery的作者Ask Solem Hoel最初在VMware就是为RabbitMQ工作的,Celery最初的设计就是基于RabbitMQ,所以使用RabbitMQ会非常稳定,成功案例很多。如果使用Redis,则需要能接受发生突然断电之类的问题造成Redis突然终止后的数据丢失等后果。

Celery序列化

在客户端和消费者之间传输数据需要序列化和反序列化,Celery支持如表9.2所示的序列化方案:

为了提供更高的性能,我们选择如下方案:

1. 选择RabbitMQ作为消息代理。

2. RabbitMQ的Python客户端选择librabbitmq这个C库。

3. 选择Msgpack做序列化。

4. 选择Redis做结果存储。

从一个简单的例子开始

安装 Celery 和 redis 以及 python 的 redis 支持:

1

2

3

sudo apt-get install redis-server

pip install redis

pip install celery

这里需要注意如果你的 celery 是 4.0 及以上版本请确保 python 的 redis 库版本在 2.10.4 及以上,否则会出现 redis 连接 timeout 的错误,具体参考

然后,我们需要写一个task:

1

2

3

4

5

6

7

8

#tasks.py

from celery import Ce

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值