ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

django01项目_异步发送短信验证码_异步方案RabbitMQ和Celery

2021-05-19 16:04:00  阅读:165  来源: 互联网

标签:异步 tasks 短信 celery sms RabbitMQ 发送 Celery


问题:

  • 由于发送短信验证码是耗时操作,如果发送短信的时候被阻塞,用户响应将会延迟
  • 当后端产生了延迟,js中的回调函数也会产生延迟,会造成用户界面的倒计时延迟
  • 效果就是用户点击了发送短信验证码,可能会产生倒计时效果不能及时显示

解决方案:

  • 异步发送短信验证码
  • 让发送短信和响应分开,将发送短信从主业务解耦出来

生产者消费者设计模式介绍

  • 为了将发送短信从主业务中解耦出来,我们引入生产者消费者设计模式
  • 项目生成发送短信验证码,缓存到消息队列,消费者读取消息队列中的发送短信消息并执行。

 

 消息队列

消息队列是消息在传输过程中保存消息的容器,在此我们选择RabbitMQ作为消息队列。

此处省去了安装Erlang和安装RabbitMQ,我们需要注意的是:RabbitMQ提供的默认账户

用户名和密码:guest、guest

协议:amqp

地址:localhost

端口:5672

查看消息队中的信息:sudo rabbitatl list_queues

思考

  • 消费者取到消息后,要消费掉
  • 可能出先高并发的情况,需要补充多任务的方式执行
  • 每一种耗时任务编写的生产者和消费者代码有重复
  • 取到消息什么时候执行,怎么执行

Celery

介绍:

  • 一个简单灵活可靠处理大量消息的分布式系统,可以在一台或者多台机器上运行
  • 单个 Celery 进程每分钟可处理数以百万计的任务。
  • 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。

安装:pip install -U Cerely

异步发送短信验证码的实现

1)首先,异步发送短信验证码是独立的。所以我们在项目目录下创建一个celery_tasks的包

 

2)在celery_tasks下创建main.py

 

celery_tasks.main.py中

# celery启动文件
from celery import Celery


# 创建celery实例
celery_app = Celery('meiduo')

 3)加载Celery配置

celery_tasks.config.py

# 指定消息队列的位置
broker_url= 'amqp://guest:guest@192.168.103.158:5672'

celery_tasks.main.py

# celery启动文件
from celery import Celery


# 创建celery实例
celery_app = Celery('meiduo')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')

定义发送短信任务

 

注册任务:celery_tasks.main.py

# celery启动文件
from celery import Celery


# 创建celery实例
celery_app = Celery('meiduo')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')
# 自动注册celery任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])

定义任务:celery_tasks.sms.tasks.py

# bind:保证task对象会作为第一个参数自动传入
# name:异步任务别名
# retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s
# max_retries:异常自动重试次数的上限
@celery_app.task(bind=True, name='ccp_send_sms_code', retry_backoff=3)
def ccp_send_sms_code(self, mobile, sms_code):
    """
    发送短信异步任务
    :param mobile: 手机号
    :param sms_code: 短信验证码
    :return: 成功0 或 失败-1
    """
    try:
        send_ret = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
    except Exception as e:
        logger.error(e)
        # 有异常自动重试三次
        raise self.retry(exc=e, max_retries=3)
    if send_ret != 0:
        # 有异常自动重试三次
        raise self.retry(exc=Exception('发送短信失败'), max_retries=3)

    return send_ret

启动celery服务

1终端进入celery_tasks目录

2启动celery服务:celery -A celery_tasks.main worker -l info

 

调用任务

完成以上操作之后,调用ccp_send_sms_code就不会产生阻塞了

 

标签:异步,tasks,短信,celery,sms,RabbitMQ,发送,Celery
来源: https://www.cnblogs.com/EF1355/p/14766119.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有