PHP消息队列实现及应用详解【队列处理订单系统及分发系统】
本文阐述了PHP消息队列的实现和应用。分享给大家参考,如下:
互联网项目开发者经常会遇到“群发短信给用户”、“订单系统中有大量日志需要记录”,或者服务器在扼杀业务时无法承受即时并发的压力。
在这种情况下,如何保证系统的正常有效运行?
这时,我们可以引入一个叫做“消息队列”的概念来解决上述需求。
消息队列的概念、原理和场景
在高并发的时候,程序往往不能及时处理。我们引入一个中间系统来分割和解压缩。
所以本质上,消息队列是一个队列结构的中间件。也就是说,将消息和内容放入这个容器后,就可以直接返回了,无需等待后处理结果。此外,还会有一个程序读取这些数据并按顺序进行处理。
1.队列结构中间件。2.消息放入后不需要立即处理。3.订户/消费者按顺序处理它们
也就是说,当你遇到一个大的或者耗时的链接,而你的业务又不需要马上知道这个链接的结果时,使用消息队列是一个不错的选择。
核心结构如下:
消息队列应用场景
1.当数据需要冗余时,例如在订单系统中,需要后续的数据转换和记录。消息队列可以将这些数据持久存储在队列中,然后由订单的后处理程序进行处理,处理完成后再从队列中删除记录。
第二,系统的解耦消息队列解决了两个系统之间的深度耦合问题。使用消息队列后,进入队列的系统和离开队列的系统之间没有直接关系。当入队系统和出队系统中的一个崩溃时,不会影响另一个的正常运行。
第三,流量削峰意味着尖峰和抢购,会有明显的流量激增,会给服务器带来很大的压力。在实际的项目开发中,使用带缓存的消息队列是一个很好的方案。
第四,异步通信消息队列本身实现了程序的异步操作,所以消息队列只要适合异步场景就可以使用
动词(verb的缩写)扩展性,如订单系统。订单进入队列后,以后可能会有财务系统来处理,但如果要增加配送系统。只需让分发系统订阅消息队列。
6.排序保证在某些场景下,数据处理顺序非常重要,队列本身可以做成单线程单输入单输出系统。从而有效保证了数据的有序处理。
常见队列实现的优缺点
队列媒体:
Mysql:可靠性高,实现容易,速度慢Redis:速度快,效率低的时候单个大消息包。消息系统:专业性强,可靠性高,学习成本高(如RabbtiMQ)
消息处理的触发机制:
无限循环模式读取:容易实现,故障时无法及时恢复;定时任务:压力分担,处理能力上限。(最大的缺陷:定位任务的时间间隔和处理的数据需要准确把握。上一个任务还没有处理,下一个认为已经开始了。)守护程序:类似于PHP-FPM和PHP-CGI,需要外壳知识。
解耦案例:排队处理订单系统和配送系统
我们之前已经了解了消息队列的使用场景
在这里,我们将处理其中一个场景:系统的解耦。
在电子商务项目中,客户提交订单后,客户可以在个人中心看到订单正在交付。这时,我们应该参与一个叫做“分配系统”的系统。如果在框架中把订单系统和配送系统一起设计,会出现一些问题:订单系统的压力比较大,但配送系统不需要及时响应这些压力;我们不需要订单系统的故障导致分销系统的故障。
因此,我们需要将两个系统分开,并通过中间队列列表相互通信。
下图显示了体系结构:
具体到我们的程序代码,一般逻辑如下:
一般流程:order.php接收用户订单,生成订单号,处理订单(订单系统);在订单系统中,配送系统所需的数据将被放入队列列表中;我们的分发系统goods.php将每分钟执行一个定时脚本来处理队列列表中的数据。
简单设计队列列表顺序_队列:
创建表` order _ queue` (`ID`int (11)无符号不为null auto _ increment,` order _ ID`int (11)无符号不为null comment' order id(来自订单系统)',` user _ info` varchar (255)不为null default'' comment '可以是用户的手机号/用户id等。(这只是演示)',' created _ at ` datetime not null comment ' order creation time ',' updated _ at ` datetime not null comment '此记录的最后处理完成时间',' status ` tinyint(2)not null comment ' 0未处理,1已处理,2正在处理',主键(` id `) engine=innodb default charset=utf8 mb4;Mysql订单队列
我们之前已经分析清楚了逻辑,剩下的就是代码实现了。
注意:我只是在这里演示代码,只是为了展示实现过程。
1.接收订单并处理订单order.php
?Php//这个文件是一个用来接收用户订单信息并将其写入队列的文件,如果(!清空($ _ get[' user _ info ']){//验证并过滤接收到的数据//todo.//这里先说一下订单中心的处理流程//因为订单系统是一个单独的系统,所以这里就不写这个系统了//todo.$ order _ id=rand (100000,99990)//正常的订单号来自订单系统。我们仅演示//将分发系统所需的订单数据保存到队列表$ insert _ data=array(' order _ id '=$ order _ id,' user _ info'=$ _ get ['user _ info'],' created _ at '=date(' y)//将上述数据插入到order_queue表//insert in order _ queue } 2。分配系统的goods.php
?Php//这个文件主要是分发系统对队列列表中的订单进行处理和标记的文件。//分析://第一步:将需要处理的记录更新为“等待处理”//第二步:选择刚刚标记为“等待处理”的记录,然后在分发系统中进行处理。//第三步:将之前处理的程序标记为“已完成”/////。你一定要明白哦////////////////////////////////////////////为什么不直接把最后的更新处理成“完成”呢,这样更先。//这是因为配送系统很可能没有及时完成,中间会有一段处理时间。如果在这个过程中还有其他程序需要读取和操作,就会产生冲突。//这个设计其实是一个锁定机制。//1,$ waiting=array(' status '=0);$ lock=array(' status '=2);//将状态为0的记录标记为2,一次更新3条记录(视情况而定)$ SQL=' update order _ queue set status=2其中status=0 limit 3 ';//2、如果(以上更新成功){//选择需要处理的订单内容//从order _ queue中选择*状态=2;//然后由分配系统处理。//todo.//3.将订单状态更新为已完成$ success=array ('status'=1,' updated _ at '=date(' y-m-d h : I 3360s ',time()));}else{回应“全部完成”;}3.linux服务器计时任务
写一个shell脚本:goods.sh
#!/bin/bash date ' % g-% m-% d % h :% m :% s ' CD/var/www/PHP goods.php是执行orders.php的脚本。
在linux服务器上部署计划任务:
crontab-e */1 * * * */var/www/goods.sh/var/www/goods_shell.log 2 $ 1每分钟执行一次goods . sh文件,并将日志记录到goods _ shell . log文件中(在相应的目录中创建文件)
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、0103010
希望本文对PHP编程有所帮助。
版权声明:PHP消息队列实现及应用详解【队列处理订单系统及分发系统】是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。