前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消息队列(一) MySQL实现消息队列

消息队列(一) MySQL实现消息队列

作者头像
用户1327360
发布于 2018-03-07 07:17:23
发布于 2018-03-07 07:17:23
15.3K00
代码可运行
举报
文章被收录于专栏:决胜机器学习决胜机器学习
运行总次数:0
代码可运行

消息队列(一)MySQL实现消息队列

(原创内容,转载请注明来源,谢谢)

一、概述

消息队列(MessageQueue,通常简称MQ)是一种进程间通信或同一进程的不同线程间的通信方式,是分布式应用间交换信息的一种技术。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。

消息队列有多种实现方式,可以用关系型数据库(如Mysql)、Nosql(如redis)、现有框架(如rabbitMQ)等。

Mysql处理消息队列的场景:主要是在数据处理量大、耗时久、处理流程繁杂、处理内容多、需要持久化(入库)、业务处理要求相对不实时的场景,如发邮件、发短信、订单后续处理、操作数据记录日志等。

二、场景分析

现假设有一个订单处理系统,包括用户支付产生订单、货物分配及发货两个子流程。现由于订单产生量大,故如果将产生订单、货物分配合并在一起执行,对于用户而言,将要等待较久的时间才能看到支付成功的页面,用户体验不佳。因此可以将这两个流程分开。

1)用户支付产生订单

在校验有货后,将货物表相应的内容取出到临时表,取出成功即返回用户支付成功待发货。

2)定时轮询临时表

编写脚本,定时(如10分钟)轮询此临时表,每次取若干条支付成功的数据(如1000条,具体看处理能力及数据量而定,保证处理时间在10分钟内),进行后续处理。

3)将第二步的数据进行后续处理,如通知物流取货、通知仓库出货,成功后将临时表的这几条数据清除(或将状态置成已发货)。

根据上述场景,对于有10000个用户同时购买时,也只需要校验是否有货,确认有货就可以给用户返回支付成功页面。而后台的处理即使100分钟(上述第二步假设每10分钟处理1000条),对于用户而言也只是100分钟后看到已发货的状态,相比于在支付页面多花1分钟甚至更多的时间来说,这100分钟反而并算不了什么。

因此,此场景就非常适合于用Mysql解决此消息队列。

三、程序实现

1)引入数据库处理文件DbDealer.php,此文件在PDO的文章中有详细的描述实现过程,主要是用PDO实现增删改查。

2)创建MQ工厂类MessageQueueDealer,通过传入的类型判断是哪种方式的MQ(本例使用的是Mysql,但预留了Redis等场景以便后续扩展),以及判断是哪种业务场景(对于本例而言是订单处理场景)。文件名messagequeue.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
require_once('service/assembly.php');
class MessageQueueDealer{
         private static $ins;
         private function__construct(){}
         private function__clone(){}
         public static functiongetInstance(){
                   if(null ==self::$ins || !($ins instanceof MessageQueueDealer)){
                            self::$ins= new MessageQueueDealer();
                   }
                   returnself::$ins;
         }
         //mq处理函数type=mysql,redis,..(mq类型)
         public functionmqDealer($type, $condition){
                   switch($type){
                            case'mysql':
                                     $this->mysqlMq($condition);
                                     break;
                            default:
                                     break;
                   }
         }
         //mysql的mqcondition=order,...(业务场景)
         private functionmysqlMq($condition){
                   switch($condition){
                            case'order':
                                     $order= new Order();
                                     $orderInfo= $order->transOrder();
                   }
         }
}       
$mq = MessageQueueDealer::getInstance()->mqDealer('mysql','order');

3)引入服务中间文件,其用于引用各个处理类,本例引入订单处理类。文件名assembly.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         <?php
require_once('order.php');

4)订单处理类Order,用于定时接处理任务。文件名order.php

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         <?php
require_once('dbDealer.php');
//订单处理类,将支付成功的订单移入另一个表,并且从本表删除
class Order{
         publicfunction transOrder(){
                   $db= DbDealer::getInstance()->getConnection();
                   $res= $db->setLimit(2)->setOrderBy(array('asc', 'id'))
                                       ->setSelectColumn(' id,name ')->get_mytable_by_status(3);//每次处理两条,把status=3的记录挪走
                   $arrOrder= $res->fetchAll(PDO::FETCH_ASSOC);//内容全部取出成关联数组
                   //两个步骤一起,插入新表以及移除旧表
                   if(!empty($arrOrder)){
                            $maxId= 0;
                            foreach($arrOrderas $order){
                                     $maxId= $maxId < $order['id'] ? $order['id'] : $maxId;
                            }
                            $db->startTrans();
                            $db->insertBatch('mynewtable',$arrOrder);
                            $db->delete('mytable',array('id' => '<'.$maxId));
                            $db->commitTrans();
                   }                
         }
}

5)编写crontab脚本,让其定时执行messagequeue,以完成订单转移。

在linux界面输入crontab –e,进入vim的编辑界面,输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*/10 * * * * php/usr/share/nginx/html/message_queue/messagequeue.php

四、总结

Mysql实现消息队列的方式较为简单,其在处理非实时的数据时具有较好优势,因为其存取方便,而非实时情况下也不会有大量的数据库连接,防止正常业务因为大量的连接而让数据库服务器奔溃。

——written by linhxx 2017.07.26

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
1.2-Air302(NB-IOT)-下载和运行第一个程序
12.增加脚本,选择lib 里面的 mqtt.lua 和 sys.lua (这是必须的文件)
杨奉武
2020/09/15
7200
1.2-Air302(NB-IOT)-下载和运行第一个程序
0.A1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn-NB-IOT-Air302-ForLua" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/05/18
8020
0.A1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板)
1.1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板+配套底板)
首先需要在终端输入:sudo apt install python3-pip (如果系统已经安装过了pip,就不需要这一步了)
杨奉武
2021/12/01
5950
1.1-Air302(NB-IOT)-硬件使用说明,下载和运行第一个lua程序(Mini板+配套底板)
3.4-Air302(NB-IOT)-网络通信-MQTT通信(本机安装MQTT+花生壳映射),MQTT文件封装
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/Learn-NB-IOT-Air302-ForLua" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2020/12/31
9160
GPRS(Air202) Lua开发: GPIO输出高低电平
如果设置GPIO0 - GPIO31管脚,则第一个参数填写 pio.P0_0 - pio.P0_31
杨奉武
2020/05/25
9180
GPRS(Air202) Lua开发: GPIO输出高低电平
在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序
咱们用LUA开发 Air202或者ESP8266的时候是不是都希望可以直接升级lua文件
杨奉武
2020/04/27
1.1K0
在LUA开发方式下,如何实现http下载LUA文件就可以实现升级Air202和ESP8266的LUA程序
05-STM32+ESP8266+AIR202/302基本控制篇-功能3-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
1.随着2G基站撤销和不再维护,对于低速,小数据量场合的通信由另一个GPRS模组代替(NB-IOT)
杨奉武
2020/09/19
9890
STM32+ESP8266+AIR202/302基本控制篇-47-功能测试-STM32+Air302(NB-IOT)+Mdebtls使用SSL单向认证方式连接MQTT服务器(不校验服务器证书)
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/03/04
7900
STM32+ESP8266+AIR202/302基本控制篇-47-功能测试-STM32+Air302(NB-IOT)+Mdebtls使用SSL单向认证方式连接MQTT服务器(不校验服务器证书)
2-STM32+ESP8266+AIR202基本控制篇-整体运行测试-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/07/29
5220
2-STM32+ESP8266+AIR202基本控制篇-整体运行测试-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
0-STM32+ESP8266+Air302基本控制篇(自建物联网平台)-整体运行测试-微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
这节测试一下微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和模组实现远程通信控制
杨奉武
2022/04/29
5420
0-STM32+ESP8266+Air302基本控制篇(自建物联网平台)-整体运行测试-微信小程序扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
AIR平台应用
前面的章节中我们学习了Flex的常用控件,Flex与外部通信 ,Cairmgorm框架的使用。到目前位置,我们所创建的Flex应用都是部署到Web服务器上,通过安装在浏览器中的Flash Player运行。事实上Flex应用程序也可以部署成为桌面应用程序,Flex桌面应用程序运行于AIR平台上,AIR相当于AIR应用程序的虚拟机,在应用程序和用户操作系统之间提供一层接口。AIR是AIR应用程序只需要编写一次就可以跨平台运行。
张哥编程
2024/12/17
1680
004-ESP32学习开发(SDK)-新建工程模板和创建新的文件
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnESP32" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
杨奉武
2021/05/11
2.1K0
004-ESP32学习开发(SDK)-新建工程模板和创建新的文件
lua
数学库由算术函数的标准集合组成,比如三角函数库(sin, cos, tan, asin, acos, etc.), 幂指函数(exp, log, log10),舍入函数(floor, ceil)、max、min,加上一个变量 pi。数学 库也定义了一个幂操作符(^)。 所有的三角函数都在弧度单位下工作。(Lua4.0 以前在度数下工作。)你可以使用 deg 和 rad 函数在度和弧度之间转换。
radaren
2018/08/28
2.3K0
Nginx Lua扩展模块
淘宝开发的 ngx_lua 模块通过将 Lua 解释器集成进 Nginx,可以采用 Lua 脚本实现业务逻辑,由于 Lua 的紧凑、快速以及内建协程,所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。
用户9615083
2022/12/25
3.7K0
Nginx Lua扩展模块
lua--数据类型、变量、循环、函数、运算符的使用
lua是一种轻量级脚本语言,由c语言编写,设计lua的初衷是为了:嵌入到应用程序中,提供灵活的扩展和定制化功能 lua官网:https://www.lua.org/ 可以从中下载安装lua
aruba
2022/06/22
1.4K0
lua--数据类型、变量、循环、函数、运算符的使用
lua实例教程_lua教程网
1.进入Lua官网:http://www.lua.org——下载Lua 2.下载文件【 lua-5.3.4_Win64bin.zip 】 3.创建一个空文件夹“Lua”并在其中解压【 lua-5.3.4_Win64bin.zip 】压缩文件 4.复制“Lua”文件夹到一个不会被删除的地方, 5.路径最好不要是中文。( 推荐选择C盘 ) 6.将此路径加入到环境变量中 7.cmd 中输入lua 查看安装是否成功
全栈程序员站长
2022/11/01
2K0
lua实例教程_lua教程网
SQL注入从入门到进阶
本文章产生的缘由是因为专业老师,让我给本专业的同学讲一哈SQL注入和XSS入门,也就是本文的入门篇,讲完两节课后,发现自己对于SQL注入的理解也就仅仅局限于入门,于是有了进阶章节的产生。
小简
2022/12/29
4K0
SQL注入从入门到进阶
Lua 5.1 参考手册
Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施。 Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持。 它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)
sunsky
2020/08/20
4.1K0
Lua 语法基础 | Nmap 脚本
and break do else elseif end false goto for function if in local nil not or repeat return then true until while
意大利的猫
2020/08/20
2.1K0
Pikachu漏洞平台通关记录
开始复习最基础的Web漏洞,查漏补缺,打好基础,我也尽量把文章写得详细一些,希望对刚入门的小白能有一些帮助。
小简
2023/01/01
2.9K0
Pikachu漏洞平台通关记录
推荐阅读
相关推荐
1.2-Air302(NB-IOT)-下载和运行第一个程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档