在业务的进行中,往往存在程序耦合的状况,例如:在商城购买商品,通过订单系统生成订单,而发货系统则根据订单来发货;按照这个逻辑,当订单系统发生故障时,发货系统也会出现问题。怎样解决这个问题,那就是解耦,使两个系统分离。
1.处理思路
1)、构建订单系统,将订单系统产生的订单已记录的形式存储在数据库中(也可使用缓存)
2)、构建发货系统,从数据库中读取订单,进行处理
2.具体实现
1)、构建订单系统,并存储数据
//1.获取用户信息(利用循环直接生成用户联系信息)
//if(isset($_GET['mobile']) && !empty($_GET['mobile'])){
//2.构建订单信息
for ($i=10; $i<30; $i++){
$order_info = [
'order_id' => rand(10000, 99999),
'mobile' => 1311234123 + $i,
'created_at' => date('Y-m-d H:i:s', time()),
'status' => 0
];
//3.将订单信息添加到订单表中
require_once '../Db_mysql/DB.php';
$db = DB::getIntance();
$res = $db->insert('order_queue', $order_info);
if($res){
echo $order_info['order_id'] . '订单生成成功!';
}else{
echo '订单生成失败!';
}
}
//}
2)、处理订单
require_once '../Db_mysql/DB.php';
$db = DB::getIntance();
while(true){
//1.将待处理的数据状态修改为正在处理,目的是为了给正在处理的数据添加锁,防止数据被其他程序修改和使用
$waiting = ['status'=>0];
$lock = ['status'=>2];
$limit = 5;//每次处理数量
$res = $db->update('order_queue', $lock, $waiting, $limit);
if($res){
//2.读取队列表,获取需要处理的数据
$res = $db->selectAll('order_queue', 'status=2');
//3.处理数据
foreach ($res as $k=>$v){
//TODO 业务处理
//更新记录状态
if($db->update('order_queue', ['status'=>1], ['id'=>$v['id']])){
echo '订单' . $v['order_id'] . '已处理</br>';
}else{
echo '订单' . $v['order_id'] . '处理失败</br>';
}
}
sleep(2);
}else{
echo '处理完成!</br>';
break;
}
}
订单系统创建订单后,会将订单信息存储到数据库中,形成一个消息队列,而发货系统直接从这个队列中读取信息,在进行处理。在这个过程中,即使订单系统出现故障,也不会影响到发货系统。