如何使用Celery在DRF(Django rest framework)中提高服务器并发实现

一、原理

Celery组成部分
首先图片中的客户端代表需要提高并发的服务器,Broker队列通常保存任务,一般使用Redis/RabbitMQ实现,任务处理者便是Celery实例了
如图:celery客户端遇到耗时操作任务的时候,直接将任务发送到Broker(中间人)来协client(任务的发出者)和worker(任务的处理者)。需要注意的是,Celery在DRF中是以单独的应用出现的,拥有自己的空间,一旦client将任务推送Broker,client就会处理其他请求,完成高度并发并不等待client用户io操作。

二、实现

首先我们得安装Celery应用
我们可以使用python的包管理器pip来安装:

pip install -U Celery

也可从官方直接下载安装包:Celery官网

tar xvfz celery-0.0.0.tar.gz
cd celery-0.0.0
python setup.py build
python setup.py install

1、搭建Celery应用

我们要在项目的同级目录搭建新的独立的Celery应用,首先我们需要创建一个celery_tasks的包,并在celery_tasks/目录下创建main.py作为Celery的启动文件,创建config.py作为Celery的配置文件。同时把我们需要处理的业务(以msg发送短信为例)放到celery_tasks/下,并为其创建tasks.py。注意tasks.py不允许重命名。最终的目录搭建结构如下图
Celery基本目录结构

2、main.py

from celery import Celery

# 为celery使用django配置文件进行设置,根据自己项目设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'

# 创建celery应用
app = Celery('meiduo')

# 导入celery配置
app.config_from_object('celery_tasks.config')

# 自动注册celery任务
app.autodiscover_tasks(['celery_tasks.sms'])

3、config.py

# 配置Celery的Broker队列存放在Redis的14号库中
broker_url = "redis://127.0.0.1/14"

4、tasks.py

# 加载的日志模块
import logging

# 导入Celery实例
from celery_tasks.main import app
# 导入发送短信的实例
from .yuntongxun.sms import CCP

logger = logging.getLogger("django")

# 验证码短信模板
SMS_CODE_TEMP_ID = 1

# 注意只有使用Celery实例装饰的应用才会生效
@app.task(name='send_sms_code')
def send_sms_code(mobile, code, expires):
    """
    发送短信验证码功能实现
    :param mobile: 手机号
    :param code: 验证码
    :param expires: 有效期
    :return: None
    """

    try:
        ccp = CCP()
        result = ccp.send_template_sms(mobile, [code, expires], SMS_CODE_TEMP_ID)
    except Exception as e:
        logger.error("发送验证码短信[异常][ mobile: %s, message: %s ]" % (mobile, e))
    else:
        if result == 0:
            logger.info("发送验证码短信[正常][ mobile: %s ]" % mobile)
        else:
            logger.warning("发送验证码短信[失败][ mobile: %s ]" % mobile)

5、服务端启动celer_tasks

# 导入Celery具体的应用
from celery_tasks.sms import tasks as sms_tasks

class SMSCodeView(GenericAPIView):
    ...
        # 发送短信验证码,一定加delay
        sms_tasks.send_sms_code.delay(mobile, 67868, 5)

        return Response({"message": "OK"})

到此位置就完成了Celery在DRF中的发送短信应用的高并发实现

6、启动celery任务

celery -A tasks worker -l info

猜你喜欢

转载自blog.csdn.net/MrNoboday/article/details/81137999