消息队列--解耦的实现

在业务的进行中,往往存在程序耦合的状况,例如:在商城购买商品,通过订单系统生成订单,而发货系统则根据订单来发货;按照这个逻辑,当订单系统发生故障时,发货系统也会出现问题。怎样解决这个问题,那就是解耦,使两个系统分离。

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;
    }
}

订单系统创建订单后,会将订单信息存储到数据库中,形成一个消息队列,而发货系统直接从这个队列中读取信息,在进行处理。在这个过程中,即使订单系统出现故障,也不会影响到发货系统。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值