Celery架构原理和使用方法
1. Celery 简介
Celery是一个自带电池的基于Python开发的分布式异步消息任务队列,它非常易于使用。通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用Celery。它主要适用于两大类场景:
- 异步:
有的任务执行时间较长,你不想让程序一直等待结果返回,可以先将改任务放入celery任务队列中,并从Celery获取一个任务ID。后续通过询问Celery来得知任务执行状态和进度。 - 定时:
需要定时执行同样的任务,Celery任务队列支持定时触发,可以按照时间间隔或者crontab表达式来触发任务。
Celery具有以下优点:
-
Simple(简单)
Celery 使用和维护都非常简单,并且不需要配置文件。它有一个活跃、友好的社区,你可以去讨论问题、需求支持。包括一个mailing-list 和一个IRC channel.
这有一个最简单的应用示例,你可以参照:
from celery import Celery
app = Celery('hello', broker='amqp://guest@localhost//')
@app.task
def hello():
return 'hello world'
-
Highly Available(高可用)
woker和client会在网络连接丢失或者失败时,自动进行重试。并且有的brokers 也支持“双主”或者“主/从”的方式实现高可用。 -
Fast(快速)
单个的Celery进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时) -
Flexible(灵活)
Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。
2. Celery基本工作流程
Celery基本工作流程3. Celery安装
你可以安装Celery通过Python包管理平台(PyPI)或者源码安装
使用pip安装:
$ pip install -U Celery
你也可以使用pip命令安装与Celery捆绑、依赖的组件:
$ pip install "celery[librabbitmq]"
$ pip install "celery[librabbitmq,redis,auth,msgpack]"
4. Celery使用
4.1 Brokers
Celery支持多种消息中间件作为Broker,即中间人。来在应用程序和Worker之间传递消息。
支持的消息中间件总览:
消息中间件 | 支持适配状态 | 支持监控 | 支持远程控制 |
---|---|---|---|
RabbitMQ | 稳定 | 是 | 是 |
Redis | 稳定 | 是 | 是 |
Amazon SQS | 稳定 | 否 | 否 |
Zookeeper | 实验 | 否 | 否 |
RabbitMQ是默认的Broker它不需要其他额外的依赖和初始化配置。可参考我之前写的文章【RabbitMQ的Python客户端pika使用调研】和官方教程【Using RabbitMQ】,至于其他的消息中间件作为broker这里就不一一展开介绍了。
4.2 Worker
4.3 触发器
4.3.1 定时触发器
4.3.2 调用触发器
4.3 管理获取任务状态
http://docs.celeryproject.org/en/latest/userguide/tasks.html#states
4.4 backend
http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-result-backends
4.5 与Flask框架集成
http://www.pythondoc.com/flask-celery/first.html#id1
4.6 与Django框架集成
踩过的一些坑
任务重复执行
使用 Celery Once 来防止 Celery 重复执行同一个任务
celery 在执行task时有个机制,就是任务时长超过了 visibility_timeout 时还没执行完,就会指定其他worker重新开始task,默认的时长是一小时.