PHP消息队列实现及应用详解【队列处理订单系统(2)

常见 队列实现 的优缺点

队列介质:

Mysql:可靠性高、易实现、速度慢
Redis:速度快,单条大消息包时效率低
消息系统:专业性强、可靠,学习成本高(比如:RabbtiMQ)

消息处理的触发机制:

死循环方式读取:易实现,故障时无法及时恢复;
定时任务:压力均分,有处理量上限。(最大的缺陷:定位任务时间的间隔和处理的数据需要精准把握,不能上一个任务还没有处理完成,下一个认为就已经启动了)
守护进程:类似于PHP-FPM和PHP-CGI,需要shell知识

解耦案列:队列处理 订单系统和配送系统

我们在前面了解过消息队列的使用场景

这里,我们要来处理其中一个场景:系统的解耦。

在电商项目中,当客户提交了一个订单之后,客户在个人中心可以看到订单处于配送中。
这个时候就要参与进来一个系统,叫做『配送系统』。如果我们在做架构的时候,把订单系统和配送系统设计在一起的话就会出现一些问题:订单系统的压力比较大,但是配送系统没有必要对这些压力做及时的反应;我们不需要订单系统出现故障之后导致配送系统故障。

所以我们需要把这2个系统分开,通过一个中间的队列表来实现这2个系统的沟通。

如下图架构:

 

具体到我们的程序代码大致逻辑如下图:

 

大致流程:order.php来接收用户订单,生成订单号并对订单进行处理(订单系统);在订单系统会把配送系统所需要的数据放入队列表中;我们的配送系统goods.php会有个定时脚本每分钟执行一次,处理队列表中的数据。

简单设计队列表order_queue:

CREATE TABLE `order_queue` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `order_id` int(11) unsigned NOT NULL COMMENT '订单ID(从订单系统来的)',
 `user_info` varchar(255) NOT NULL DEFAULT '' COMMENT '可以是用户手机号/用户id等(这里只是演示)',
 `created_at` datetime NOT NULL COMMENT '订单创建时间',
 `updated_at` datetime NOT NULL COMMENT '本记录最后处理完成时间',
 `status` tinyint(2) NOT NULL COMMENT '0未处理,1已处理,2处理中',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

mysql订单队列

前面我们已经分析清楚了逻辑,剩下的就是代码实现了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5700.html