最近在培训压测平台中,因为需要使用到消息队列,考虑到很多同学的电脑windows不支持很多开源消息队列的原因,加上复杂繁重的那些中间件大家部署安装总是出错。所以自研了一个超轻量级的小工具:django-task-mq
效果(在压测平台中效果):(开了俩个消费者进程)
控制台输出: (为了方便理解,故意添加了no task... )
然后说说它目前的功能和未来要做的扩展:
具备broker中心,消费者端,生产者端,topic,优先级,分布式都有。
【原理】:原理很简单,借助django的orm技术,在数据库中新建持久消息表,结合算法成为先进先出的栈。
【优点】:理解和使用简单,不需要复杂的安装和各种依赖,支持各种系统,轻量级,适用于中小型消息队列需求。
【使用流程】:
(一:初始化)
首先要下载:pip3 install django-task-mq
然后先打开你的django项目目录,找到你的app目录,在app目录内,新建一个任意名称的.py文件。
然后在这个文件内直接粘贴复制下面代码,之后独立用python3来运行该文件
import os from django_task_mq import mq_init mq_init(os.path.dirname(os.path.abspath(__file__)))
这步的目的是初始化消息内容表,它会自动重写你的models.py和admin.py。
然后你要手动的去控制台执行数据库同步的俩个命令:
python3 manage.py makemigrations
python3 manage.py migrate
到此,表就弄好了,你可以在admin后台看到了。
注意,此初始化函数只能执行一次,所以之后请清空文件内容,你不删除这句它就会提醒你重复执行,虽然也没啥报错等后果。
(二:设置生产者)
在你想要新建生产者的函数内,导入并调用mq_producer函数即可。具体可以参考示例:
from django_task_mq import mq_producer mq_producer(DB_django_task_mq,topic='',message={})
注意,第一个DB_django_task_mq为上一步中自动创建的消息表本体,你需要自行导入,如from MyApp.models import * 。不过,在一般django的views.py中,你肯定早就一开始就导入了所有表了...
topic为管道/标识符/过滤符/分类名 等等意思。
message为字典类型的数据存储,你可以任意往里面写内容。
之后,当这个函数被调用,就会在消息表中新增一条消息记录。
(三:新增消费者)
消费者本质上是一个进程,这个进程是在执行一个文件,这个文件在监控数据库消息表,并且按照先进先出规定来消费消息。
还是在一开始新建的这个文件,导入并调用 mq_consumer 函数。
import os,sys,django sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings'%'') # 引号中请输入您的setting父级目录名 django.setup() from MyApp.models import DB_django_task_mq from django_task_mq import mq_consumer from MyApp.views import play mq_consumer(DB_django_task_mq,play,topic='yace')
注意,第三行里,你需要手动写上你的settings.py的父级文件夹名字。为什么我不自动给你计算呢?因为很多同学名字叫的五花八门,写个复杂算法来排查出来不值当,还是直接手写后程序执行速度才快。
然后里面的MyApp要改成你自己项目的app文件夹名字。
里面的play函数为你读取了消息后要执行的业务函数。所以替换成你的函数名字就可以,我的函数做的事就是去压测这个message里面的内容。
注意这个play函数有且只能接收message一个参数。所以你最好在一开始就给message这个字典塞满你要的一切内容。
topic 是你要读取的标识符,对不上topic的消息则不会消费掉。
然后你启动这个消费者的方式有很多:
- 在pycharm里右键直接运行这个文件。
- 在pycharm里Terminal终端用python3运行这个文件。
- 在终端或cmd窗口里用python3来运行这个文件。
- 用nohup命令 后台运行这个文件。
- 等等...
注意,这个文件是可以多个并行的,你想运行几个就运行几个,多个消费者并不会冲突。
(培训班内会讲解工具源码和开发思路)
就暂时研发到这,工具才诞生,以后会慢慢更新扩展功能。也欢迎大家提供g改进建议。