Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:
你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情。
你想做一个定时任务,比如每天检测一下你们所有客户的资料,如果发现今天 是客户的生日,就给他发个短信祝福。
Celery有以下优点:
- 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的
- 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
- 快速:一个单进程的celery每分钟可处理上百万个任务
- 灵活: 几乎celery的各个组件都可以被扩展及自定制
Celery包括如下组件:
- Celery Beat
任务调度器,Beat进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列
- celery Worker
执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率
- Broker
消息代理,或者叫做消息中间件,接受任务生产者发送过来的任务消息,存进队列在按序分发给任务消费方(通常是消息队列或者数据库)
- Producer
调用了Celery提供的API,函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者
- Result Backend
任务处理完后保存状态信息和结果,以供查询。Celery默认已支持 Redis,RabbitMQ, MongoDB,Django ORM,SQLAIchemy等方式
Celery目前支持很多第三方软件作为消息代理,但适用于生产环境的只有RabbitMQ和Redis,至于其他的方式,一是支持有限,二是可能得不到更好的技术支持。Celery官方推荐的是RabbitMQ。
在客户端和消费者之间传输数据需要序列化和反序列化,Celery支持如下表的序列化方案:
方案 | 说明 |
---|---|
pickle | pickle是Python标准库中的一个模块,支持Python内置的数据结构,但是它是Python的专有协议。 从Celery3.2开始,由于安全性等原因Celery将拒绝pickle这个方案 |
json | json支持多种语言,可用于跨语言方案 |
yaml | yaml的表达能力更强,支持的数据类型比json多,但是python客户端的性能不如json |
msgpack | msgpack是一个二进制的类json的序列化方案,但是比json的数据结构更小、更快 |