celery

celery

一、celery是什么

Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统专注于实时处理的异步任务队列,同时也支持任务调度

二、celery实现原理

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

  1. Producer : 任务生产者. 调用 Celery API , 函数或者装饰器, 而产生任务并交给任务队列处理的都是任务生产者.(通过装饰器修饰调用producer,产生任务并加入到队列中)
  2. 消息中间件broker -将任务提交至任务队列
    Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等
    RabbitMQ和 Redis的区别:
    https://blog.csdn.net/dd18709200301/article/details/79077839
  3. 任务执行单元worker- 负责将任务从任务队列中取出后的执行
    Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中
    !!注意:同一时刻,可以启用多个worker进行执行任务,只要启动worker,只要broker提交了任务,自动执行。
  4. 任务结果存储Task result store
    Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

celery框架集成

常用框架框架内celery依赖包
Djangodjango-celery
Pyramidpyramid_celery
Pylonscelery-pylons
Flask不需要
web2pyweb2py-celery
Tornadotornado-celery

三、celery应用场景

异步任务:

将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等,提高系统的吞吐量和响应时间。

系统吞吐量是指在单位时间内中央处理器(CPU)从存储设备读取、处理、存储信息的量。

影响因素:
	存储设备的存取速度,即从存储器读出数据或数据写入存储器所需时间;
	CPU性能:时钟频率;每条指令所花的时钟周期数(即CPI);
	指令条数;系统结构:如并行处理结构可增大吞吐量。

定时任务:

定时执行某件事情,比如每天数据统计

四、celery项目应用

  • 定时任务:秒杀模块设计定时任务将信息保存到redis中

    在秒杀课程的模块中,考虑到同一时间同时进行抢购,网站瞬时访问流量激增,所以采用了Redis分布式缓存系统,支持多种数据结构:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升,设置定时任务,将参加活动的课程信息提前保存到redis中并设置过期时间,定时执行该任务即可。

  • 异步任务:向会员推送生日祝福

    异步任务:根据用户类型的不同,在会员生日的时候通过异步任务乡会员推送生日祝福信息,并向会员赠送平台优惠券,可用于课程的购买等
    中间件选择的是rabbitmq,中间件常用的是redis和rabbitmq,选择rabbitmq的原因是:

    1. Rabbitmq具有消息消费确认机制,如果发布一条消息,还没有消费者消费该队列,那么这条消息将一直存放在队列中,直到有消费者消费了该条消息,以此可以保证消息的可靠消费
    2. 实时性方面来对比redis实时性高,redis作为高效的缓存服务器,所有的数据都保存在内存中,所以它具有更高的实时性,我们向会员推送的生日祝福在生日当天推送即可,对实时性要求较低,rabbitmq完全可以胜任
    3. rabbitmq队列,每条消息都可以选择性持久化,持久化粒度更小,更灵活;redis是全部内容持久化;并且rabbitmq实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以方面我们更好的使用;而redis没有所谓的监控平台

相比较之下rabbitmq的优势就在于提供可靠的队列服务,并且可做到异步,而redis主要是用于缓存的,redis的发布订阅模块,可用于实现及时性,且可靠性低的功能。

  • 异步任务:数据库备份脚本

五、celery项目问题及解决方案

1. beat启动时生成的pid文件需要手动删除

2. celery配置async包

错误原因:python3.6及其以上的版本已经将async收入关键字中,celery4.0版本也用到了async,如果不配置backend的话是不会出现这个错误的
解决方案

  • 先到 "Python\Python37\site-packages\kombu"目录下更改"async"文件夹名称,改成其他名称即可;
  • 重启worker,修改代码 :将所有"async"改为,上一步新命的名;直至不再报
    与"async"相关的错误.

3. ‘Command’ has no attribute ‘option_list’

解决方案:修改代码: 在 "Command"类下添加属性 option_list=()

	classCommand(models.Model)):
		option_list=() # 给这个类加个属性
		pass

4. worker 可以正常启动,但是接不到任务

具体信息:celery AttributeError: ‘str’ objecthas no attribute ‘items’
错误原因:Redis 版本过高
解决方案:降低其版本

5. celery的定时任务会有一定时间的延迟。

我规定模拟登陆新浪微博任务每隔10个小时执行一次,那么定时任务第一次执行就会在开启定时任务之后的10个小时后才会执行。而我抓取微博需要马上执行,需要带上cookie,所以不能等那10个小时。这个没有一个比较好的解决方法,可以使用celery的crontab()来代替schdule斜体样式做定时,它会在启动的时候就执行。我采用的方法是第一次手动执行该任务,然后再通过schedule执行。

5. celery的定时任务会重复执行同一个任务

解决方案

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
概要介绍:本门课程属于“Java分布式中间件大汇聚实战”系列课程,主要介绍了企业级项目中真实的应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)的实战等等。除此之外,还介绍了如何基于Redis设计并实战一款点赞系统(点赞、取消点赞、排行榜、用户中心、文章点赞用户列表…)可以说技术干货甚多,不仅可以巩固企业级应用系统的开发实战能力,相信在面试、跳槽涨薪方面也能带来相应的帮助!课程内容:传说中的金三银四、面试跳槽涨薪季已经来临,Debug特地为大家准备了一系列跟面试、跳槽、巩固核心技术栈相关的课程,本门课程属于第一季,其中的内容包括企业级项目中真实的应用场景实战、面试相关的技术点分享、主流的Java技术栈(Undertow、Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)实战等等。除此之外,我们还基于Redis设计并实战了一款点赞系统,可以说技术干货甚多。在课程的最后,Debug给大家整理了一份最新的面向BAT大厂招聘 ~ 2020年程序猿最新的Java面试题(附带目录和答案),希望对各位小伙伴的成长有所帮助!值得一提的是,本季课程实战的应用场景包括“日志记录”、“邮件发送”、“通告消息通知”、“短信验证码失效验证”、“会员到期自动提醒/到期前N天自动提醒”以及“点赞系统”的设计与实战,其大纲如下所示:其中,涉及到的技术栈包括Spring Boot2.0、Mybatis、Undertow、Redis、RabbitMQ、Redisson、Spring AOP、 Java8…下面罗列出本门课程重点介绍的价格应用案例以及业务场景的实现流程图!(1)基于Spring的消息驱动模型实现日志的异步记录:(2)基于消息中间件RabbitMQ的消息队列实现日志的异步记录:(3)基于缓存中间件Redis的订阅发布机制实现商户公告消息通知:(4)基于Redis的Key失效与定时任务实现实现短信验证码的过期失效验证:其他核心、典型的应用案例和业务场景的实战可以详细参考“课程目录”!除此之外,我们还基于缓存中间件Redis设计并实战实现了点赞系统中的点赞功能模块,下面罗列出其中涉及到的相关功能模块的实战流程图:其课程收益如下所示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值