开源web框架django知识总结(十)
异步方案Celery
生产者消费者设计模式
思考:
- 下面两行代码存在什么问题?
CCP().send_template_sms(mobile, [sms_code, 5], 1)
return JsonResponse({
'code': 0,'errmsg': 'ok'})
问题:
-
我们的代码是自上而下同步执行的。
-
借用第三方接口,也受网络延迟等多方面影响。
-
发送短信是耗时的操作。如果短信被阻塞住,用户响应将会延迟。
-
响应延迟会造成用户界面的倒计时延迟。
解决: -
异步发送短信
-
发送短信和响应分开执行,将发送短信从主业务中解耦出来。
思考:
- 如何将发送短信从主业务中解耦出来。
生产者消费者设计模式介绍
-
为了将发送短信从主业务中解耦出来,我们引入生产者消费者设计模式。
-
它是最常用的解耦方式之一,寻找**中间人(broker)**搭桥,保证两个业务没有直接关联。
总结: -
生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
-
由阿尔法商城生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。
Celery介绍和使用
思考:
- 消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
- 任务可能出现高并发的情况,需要补充多任务的方式执行。
- 耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。
- 取到的消息什么时候执行,以什么样的方式执行。
结论:
- 实际开发中,我们可以借助成熟的工具
Celery
来完成。- 有了
Celery
,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。
1. Celery介绍
-
Celery介绍:
- 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
- 单个 Celery 进程每分钟可处理数以百万计的任务。
- 通过消息进行通信,使用
消息队列(broker)
在客户端
和消费者
之间进行协调。
-
安装Celery:
pip install -U Celery # -u 参数是升级安装(原来没有,直接安装;有,升级到最新)
2. 创建Celery实例并加载配置
1.定义Celery_tasks包、创建Celery初始化模块、配置文件
config.py
# 如果使用 redis 作为中间人
# 需要这样配置:
# 1、将来生产者会把任务发布到redis的10号库
# 2、消费者会从redis的10号库中提取任务并执行
broker_url='redis://192.168.42.128:6379/10'
main.py
"""
该文件作为异步应用程序初始化的模块
"""
# 在异步任务程序中加载django的环境
import os
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE',
'aerf_mall.settings.dev' # 此行aerf_mall要改成你对应的项目名字
)
from celery import Celery
# 初始化一个应用程序对象
app = Celery("aerf")
# 加载配置文件——参数是配置文件(模块)的导包路径
# 我们将来是在celery_tasks包所在的目录为工作目录运行异步程序;
app.config_from_object('celery_tasks.config')
# 告知app监听的任务有哪些
# 该函数的参数是一个列表,列表里写的是任务包的导包路径
app.autodiscover_tasks([
'celery_tasks.sms',
])
2、将之前修改好的yuntongxun文件夹拷贝过来,修改ccp_sms.py引入包的位置
# from libs.yuntongxun.CCPRestSDK import REST
from .CCPRestSDK import REST
3、新建sms包,新建tasks.py文件
tasks.py
"""
tasks.py文件名是固定,该文件中定义异步任务函数!!
"""
from celery_tasks.main import app
from celery_tasks