Celery-redbeat中文介绍(一款基于Redis的改良scheduler)

本文分两部分,第一部分是对Celery的简单介绍(摘自https://foofish.net/celery-toturial1.html),第二部分介绍Celery-redbeat的原理、场景及用法(渣翻译)。

 

一、Celery介绍

在一个应用服务中,对于时效性要求没那么高的业务场景,我们没必要等到所有任务执行完才返回结果,例如用户注册场景中,保存了用户账号密码之后,就可以立即返回,后续的账号激活邮件,可以用一种异步的形式去处理,这种异步操作可以用队列服务来实现。否则,如果等到邮件发送成功可能几秒过去了。

Celery 是什么?

Celery 是 Python 语言实现的分布式队列服务,除了支持即时任务,还支持定时任务,Celery 有5个核心角色。

1、Task

任务(Task)就是你要做的事情,例如一个注册流程里面有很多任务,给用户发验证邮件就是一个任务,这种耗时任务可以交给Celery去处理,还有一种任务是定时任务,比如每天定时统计网站的注册人数,这个也可以交给Celery周期性的处理。

2、Broker

Broker 的中文意思是经纪人,指为市场上买卖双方提供中介服务的人。在Celery中它介于生产者和消费者之间经纪人,这个角色相当于数据结构中的队列。例如一个Web系统中,生产者是处理核心业务的Web程序,业务中可能会产生一些耗时的任务,比如短信,生产者会将任务发送给 Broker,就是把这个任务暂时放到队列中,等待消费者来处理。消费者是 Worker,是专门用于执行任务的后台服务。Worker 将实时监控队列中是否有新的任务,如果有就拿出来进行处理。Celery 本身不提供队列服务,一般用 Redis 或者 RabbitMQ 来扮演 Broker 的角色

3、Worker

Worker 就是那个一直在后台执行任务的人,也称为任务的消费者,它会实时地监控队列中有没有任务,如果有就立即取出来执行。

4、Beat

Beat 是一个定时任务调度器,它会根据配置定时将任务发送给 Broker,等待 Worker 来消费。

5、Backend

Backend 用于保存任务的执行结果,每个任务都有返回值,比如发送邮件的服务会告诉我们有没有发送成功,这个结果就是存在Backend中,当然我们并不总是要关心任务的执行结果。

 

二、Celery-redbeat

1、什么是Celery-redbeat?

Celery-redbeat是基于redis作为celery的中间件(broker)时的一个任务调度器(scheduler),有效提高调度器(scheduler)健壮性。

2、为什么使用Celery-redbeat?

在Redis作为消息中间件时,可以把监控任务这一部分也放在Redis上。虽然已经有celerybeatredis这样现有的包实现类似效果,但是它和 django-celery 存在同样的问题,就是在任务发生变化时,需要暂停并全部重载。

因此RedBeat的开发者,在利用Redis现有特性下完成了RedBeat这个包,解决了这个问题。

3、RedBeat的优势

最大的变化就是,它将调度器从原来Celery进程中的定时任务调度器(默认作为守护进程),改存在了Redis上。

因此,当任务创建或者发生变化的时候,调度器不再需要暂停和重载。利用Redis数据库的特性,我们只需要更新Redis中的键名,调度器就会随之发生改变。

调度器放在Redis上还有一个优点,就是对语言的兼容性变强了,只要可以绑定Redis,就可以处理各种语言上的celery问题。Redis加载调度器可以让多任务启动和关闭更加迅速和便利,也会让程序更加健壮和稳定。 

RedBeat还加了一个简单的锁(可以手动关闭),防止多个调度器同时作为守护进程运行。

4、基本用法

安装

pip install celery-redbeat

在Celery配置文件中对Redbeat进行配置

redbeat_redis_url = "redis://localhost:6379/1"

指定调度器

celery beat -S redbeat.RedBeatScheduler

RedBeat限制多个调度器同时运行,配置参数手动关闭

redbeat_lock_key = None

redbeat_key_prefix

设置Redis中所有RedBeat相关键的前缀,不设置时,默认为‘redbeat’

5、详细介绍和使用详见https://github.com/sibson/redbeat

 

你可能感兴趣的:(python,celery,RedBeat,celery,RedBeat,Redis,python,backend)