项目中,发送验证码,因为代码自上而下,会先发送验证码,后响应倒计时
流程如下:
- 发送短信是耗时的操作。如果短信被阻塞住,用户响应将会延迟。
- 响应延迟会造成用户界面的倒计时延迟。
如何解决呢?
- 发送短信和响应分开执行,将
发送短信
从主业务中解耦
出来。
用什么方式来解耦呢?【概念】
最常用的解耦方式之一,寻找中间人(broker)搭桥,保证两个业务没有直接关联,我们称这一解耦方式为:生产者消费者设计模式
- 生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
- 由美多商城生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。
Celery 介绍和使用 【重点】
一、介绍
概念:celery 是一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行.
特点:1.单个 Celery 进程每分钟可处理数以百万计的任务. 2.通过消息进行通信,使用消息队列( 中间人或broker )
在生产者
和消费者
之间进行协调。
二、安装
# 安装到虚拟环境, 你懂得~
pip install Celery -i https://pypi.tuna.tsinghua.edu.cn/simple
https://docs.celeryproject.org/en/latest/index.html # Celery 官方文档
三、创建实例并且配置
1、定义 Celery 工层包
在项目外层目录增加一个包, 名字叫做: celery_tasks
2、创建 Celery 实例
在 celery_tasks 包中添加 main.py 文件 并添加以下内容:
# 从你刚刚下载的包中导入 Celery 类
from celery import Celery
# 利用导入的 Celery 创建对象
celery_app = Celery('meiduo')
3、加载 Celery 配置
在 celery_tasks 包中再添加一个 config.py 文件
在这个文件中指定一下 消息队列( 中间人 )的位置:
# 如果使用 redis 作为中间人
# 需要这样配置:
broker_url='redis://127.0.0.1:6379/3'
在celery_tasks/main.py
中, 额外增加如下代码:
from celery import Celery
# 1、新建celery应用程序对象
celery_app = Celery('meiduo')
# 2、加载配置模块
celery_app.config_from_object('celery_tasks.config')
四、定义任务包
1、新建并注册任务包
我们需要在 celery_tasks
包下, 再创建一个包, 名字随意。
例如, 我这里为 sms
。
创建好后, 需要在里面添加一个 tasks.py
文件。
注意, 这里的 tasks
名字是规定死的。
然后需要在celery_tasks/main.py
注册刚刚创建的任务包。
from celery import Celery
# 1、新建celery应用程序对象
celery_app = Celery('meiduo')
# 2、加载配置模块
celery_app.config_from_object('celery_tasks.config')
# 3、注册任务包
celery_app.autodiscover_tasks([
'celery_tasks.sms'
])
2、实现任务函数
已经注册任务包之后, 我们就可以在 tasks.py
中创建具体的任务函数了。
在celery_tasks/sms/tasks.py
文件中添加如下代码:
from celery_tasks.main import celery_app
from celery_tasks.yuntongxun.ccp_sms import CCP
# 该函数就是一个任务, 用于发送短信,备celery_app.task所装饰
@celery_app.task(name='ccp_send_sms_code')
def ccp_send_sms_code(mobile, sms_code):
result = CCP().send_template_sms(mobile,[sms_code, 5],1)
return result
五、异步调用任务
# 原来的写法: 同步调用,函数会阻塞,导致后端无法及时响应。
# CCP().send_template_sms(mobile, [sms_code, 5], 1)
# 异步调用,将函数任务执行交给celery程序做,实现解耦。
# 改为现在的写法, 注意: 这里的函数,调用的时候需要加: .delay()
ccp_send_sms_code.delay(mobile, sms_code)
六、启动消费者( celery充当 )
celery -A celery_tasks.main worker -l info
- celery : 调用 celery 命令
- -A : 作用是指定要启动的文件, 这个参数后面的文件会被执行.
- worker : 启动的对象是 worker, 工人, 干活的人
- -l : 指日志打印等级, 一般日志都是通知形式的, 即: info 级别