-
生产者与消费者的意思:
生产者生成消息,缓存到消息队列中,消费者读取消息队列中的消息并执行。
由商城生成发送短信消息,缓存到消息队列中,消费者读取消息队列中的发送短信消息并执行。 -
为了将发送短信从主业务中解耦出去,我们要引入的是生产者和消费者设计模型,这是最常见的解耦方式之一,寻找中间人搭桥,保证两个业务没有直接关联。
其中:生产者是flask项目 消费者是celery 中间人是Redis消息队列
消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
任务可能出现高并发的情况,需要补充多任务的方式执行。
耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。
取到的消息什么时候执行,以什么样的方式执行。
实际开发中,我们可以借助成熟的工具Celery来完成。
有了Celery,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。
Celery介绍
• Celery介绍
• 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
• 单个 Celery 进程每分钟可处理数以百万计的任务。
• 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。
安装:
pip install celery
启动celery
到工作目录下执行:
celery -A lghome.tasks.main worker -l info -P eventlet
-A指定了main目录,-P指定使用eventlet
celery程序:
task_sms.py
from celery import Celery
from lghome.libs.ronglianyun.ccp_sms import CCP
# 创建celery对象 redis 16 0-15
celery_app = Celery("home", broker="redis://127.0.0.1:6379/1")
@celery_app.task
def send_sms(mobile, datas, tid):
"""发送短信的异步任务"""
ccp = CCP()
ccp.send_message(mobile, datas, tid)
对应的文件夹层级:
新建tasks文件夹,含有定义短信发送任务的sms文件夹,config配置文件,main定义celery_app,
config:
BROKER_URL = 'redis://127.0.0.1:6379/1'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'
定义存放中间人的Redis和存放结果的Redis
main:
from celery import Celery
celery_app = Celery("home")
# 加载配置文件
celery_app.config_from_object("lghome.tasks.config")
# 注册任务
celery_app.autodiscover_tasks(["lghome.tasks.sms"])
tasks:
from lghome.tasks.main import celery_app
from lghome.libs.ronglianyun.ccp_sms import CCP
@celery_app.task
def send_sms(mobile, datas, tid):
"""发送短信的异步任务"""
ccp = CCP()
ccp.send_message(mobile, datas, tid)
verify_code文件内定义
from lghome.tasks.sms.tasks import send_sms
send_sms.delay(mobile, (sms_code, int(constants.SMS_CODE_REDIS_EXPIRES/60)), 1)
注:deley是关键,需要用这个参数表明是异步执行
celery执行结果:
在注册之后,可以看到:
在发送验证码成功后: