本篇主要介绍关于分布式异步任务队列神器--celery,本篇主要参考其他的博客(会在下面注释)和相关资源进行整理而成。
一、引入异步任务
当我们做网站后端程序开发时,会遇到这种情况:
1、在没有使用异步任务时:当我们点击获取短信验证码的时候或者通过邮箱注册时,会发现 在点击过后会过一小会 才进入倒计时,这是由于 在向后端发送请求发送短信验证码或者邮箱验证时,后端会调用第三方平台发送短信或者通过SMTP服务器进行邮箱发送,而这个过程是一个较为耗时的操作,那么客户端会等待很久,造成不好的用户体验。
2、使用异步任务:若我们点击获取短信验证码或者邮箱注册验证时,服务器在接收到请求,将任务交给另外一个进程去执行,而直接返回响应,那么用户则会马上进入倒计时的操作,即用户可以做接下来的操作。故:
故:我们通常可以将一些耗时耗资源的任务交给异步任务来进行处理,同时也会将一些定时任务(例如在用户登录或者注册后5分钟,给用户发送一份表示欢迎的邮件),或者让异步任务执行一些按时操作任务(例如每一个小时查询一下天气预报,并存储至数据库中进行数据分析)等。
二、celery介绍
Celery是一个专注于实时处理和任务调度的分布式任务队列。所谓任务就是消息,消息中的有效载荷中包含要执行任务需要的全部数据。它是一个异步任务调度工具,用户使用 Celery 产生任务,借用中间人来传递任务,任务执行单元从中间人那里消费任务。
celery通过消息进行通信,通常使用一个叫Broker(中间人)来协调client(任务的发出者)和worker(任务的处理者). clients发出消息到队列中,worker通过监测 broker中的任务发布情况来,若有则接收任务进行处理。
注:Celery 本身不是任务队列, 是管理分布式任务队列的工具. 它封装了操作常见任务队列的各种操作, 我们使用它可以快速进行任务队列的使用与管理.
其原理大致如下:
当然关于celery还有两个角色:
- celery beat: 任务调度, 根据配置文件发布定时任务。
- backend: 存储结果的后端服务器。
三、应用场景
一、耗时耗资源的操作。
用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给Celery去异步执行,执行完再返回给用户。这段时间用户不需要等待,提高了网站的整体吞吐量和响应时间。
二、定时任务。
对一些需要进行定时操作的任务,比如上面提到的 每隔一个小时查询一次天气预报、或者例如 京东每几秒执行首页页面静态化操作(为了提升用户访问首页的速度,由于加载动态页面可能会大量的请求后端进行数据库的查询,故通常将动态页面静态化)、或者每天的某个时间点进行消息推送等。
三、延时操作。
对于一些需要延时操作,例如说 当用户登录成功或者注册成功后,几分钟后给用户发送邮件提醒用户在哪个地方进行了登录等操作,若这类延时操作交由主程序来进行操作,那么将会造成阻塞,即用户一直得不到响应。
四、高并发的请求任务。
互联网已经普及,人们的衣食住行中产生的交易都可以线上进行,这就避免不了某些时间极高的并发任务请求,如公司中常见的购买理财、学生缴费,在理财产品投放市场后、开学前的一段时间,交易量猛增,确认交易时间较长,此时可以把交易请求任务交给 Celery 去异步执行,执行完再将结果返回给用户。用户提交后不需要等待,任务完成后会通知到用户(购买成功或缴费成功),提高了网站的整体吞吐量和响应时间,几乎不需要增加硬件成本即可满足高并发。
四、基本实现