celery异步发送短信验证码

项目中,发送验证码,因为代码自上而下,会先发送验证码,后响应倒计时

流程如下:

  • 发送短信是耗时的操作。如果短信被阻塞住,用户响应将会延迟。
  • 响应延迟会造成用户界面的倒计时延迟。

如何解决呢?

  • 发送短信和响应分开执行,将发送短信从主业务中解耦出来。

用什么方式来解耦呢?【概念】

       最常用的解耦方式之一,寻找中间人(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 级别

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值