Django项目(十)异步发送celery

生产者消费者设计模式
问题:
● 我们的代码是自上而下同步执行的。
● 发送短信是耗时的操作。如果短信被阻塞住,用户响应将会延迟。
● 响应延迟会造成用户界面的倒计时延迟。
在这里插入图片描述
解决:
● 异步发送短信
● 发送短信和响应分开执行,将发送短信从主业务中解耦出来
在这里插入图片描述
生产者消费者设计模式介绍
● 为了将发送短信从主业务中解耦出来,我们引入生产者消费者设计模式。
● 它是最常用的解耦方式之一,寻找中间人(broker)搭桥,保证两个业务没有直接关联
在这里插入图片描述
总结:
● 生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
● 由网站生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。
Celery介绍和使用
思考:
● 消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
● 任务可能出现高并发的情况,需要补充多任务的方式执行。
● 耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。
● 取到的消息什么时候执行,以什么样的方式执行。
结论:
● 实际开发中,我们可以借助成熟的工具Celery来完成。
● 有了Celery,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。
创建Celery实例
celery_tasks.main.py

# celery启动文件
from celery import Celery
# 创建celery实例
celery_app = Celery('lg')

加载Celery配置
celery_tasks.config.py

# 指定消息队列的位置
broker_url = "redis://127.0.0.1/10"
# celery启动文件
from celery import Celery
# 创建celery实例
celery_app = Celery('lg')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')

定义发送短信任务

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

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

@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服务

celery -A celery_tasks.main worker -l info

● -A指对应的应用程序, 其参数是项目中 Celery实例的位置。
● worker指这里要启动的worker。
● -l指日志等级,比如info等级。
调用发送短信任务

# 发送短信验证码
# CCP().send_template_sms(mobile,[sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], constants.SEND_SMS_TEMPLATE_ID)
# Celery异步发送短信验证码
ccp_send_sms_code.delay(mobile, sms_code)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哥哥的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值