redis的队列消息实现应用解耦
过度耦合的缺点:php应用中,过度的耦合使得系统拓展性变弱,联动性错误。
今天我给大家介绍的是利用redis的队列消息实现模块间的解耦。
应用场景:用户在采购模块下单买了一批货物回来,签收时要在仓库模块添加相应的库存,普通的做法就是在签收完成的时候通过接口给仓库模块推送数据执行入库操作。但是这么做如果仓库模块发送错误,没有入库成功就会导致采购模块签收失败,这就是耦合给系统带来的缺点。
解决方案:运用php+redis队列消息的技术,当用户签收成功的时候,把数据放入队列中,入列成功采购模块则返回签收成功的提示给用户,后续的操作都不需要采购模块操心,然后仓库系统可以通过redis的订阅发布模式来进行监听,当有数据入列,则仓库系统就执行入库逻辑代码的
运行。
关键点:
1、如果redis服务器挂掉了怎么办啊?
在采购模块的签收逻辑代码中做判断,如果入列成功则返回签收完成,如果入列失败这运行传统方法,通过接口入库的方法。如果redis也挂了,仓库模块也挂了怎么办啊,那你就收拾包袱回家吧。
2、如何实现传统方式那样实时入库啊?
采用redis的订阅发布模式就可以解决。订阅的代码放在仓库模块,发布的代码放在采购模块。
订阅代码sub.php
<?php $redis = new Redis(); $redis->connect('localhost', 6379); $redis->subscribe(['ruku'], function ($redis, $chan, $msg) {//订阅入库频道
if($msg==2500){
//如果监听到有发布信息则从队列中拿取信息进行入库操作
。。。。。。。
} });
发布代码pub.php
<?php $redis = new Redis(); $redis->connect('localhost', 6379); $order = ['id' => 1, 'name' => '小米6', 'price' => 2499, 'created_at' => '2017-07-14'];
$redis->lpush('order',$order); $redis->publish("ruku", 2500);

浙公网安备 33010602011771号