注册 登陆

    2018-07-02 15:35:42消息队列介绍及应用场景demo

    您现在的位置是: 首页 >  php >  消息队列介绍及应用场景demo


    核心结构:

    业务系统--(入队)--》消息队列--(出对)--》队列处理系统

     

    应用场景:

    冗余  解耦    削峰案例  异步通信

    扩展性   排序保证


    消息队列优缺点:

    mysql(mysql订单队列) 可靠性高 易实现 速度慢

    redis 速度快 单条大消息包时效率低

    消息系统:专业性强 可靠 学习成本高

    消息处理触发机制


    死循环方式读取:易实现,故障时无法及时恢复

    定时任务:压力均分 有处理量上限

    解耦案例


    架构设计

    1.1订单系统接受用户订单 ----》订单列表----》配送系统和标记配送结构


    2.2程序流程

    接受用户订单---》订单系统---》队列表(order_id,status,address,create)time,update_time)---》配送处理系统goods.php(需要一个定时脚本goods.sh)----》配送系统

    流量削峰案例(分流 解压 中间键 )


    redis 的list 类型实现秒杀

    特点:秒杀就是瞬间有巨大的访问量

    不用mysql做秒杀的原因:

    myslq需要往硬盘里面写,redis基于内存,而且其他业务也可能使用mysql,如果秒杀使用mysql,那瞬间的流量会把mysql资源耗光,造成mysql死锁。redis会不定期把数据写到硬盘里,不用担心断电的问题。


    redis 提供5中类型  双向链表(有序集合):

    LPUSH/LPUSHX 将值插入到/(存在的)列表头部

    RPUSH/RPUSHX 将值插入到/存在的列表尾部

    LPOP 移出并获取列表的第一个元素

    RPOP移出并获取列表的最后一个元素

    ltrim  保留指定区间内的元素

    LIEN 获取列表长度

    LSET 通过索引设置列表元素的值

    LINDEX 通过索引获取列表中的元素

    LRANGE 获取列表制定范围内的元素


    架构设计:

    秒杀业务程序(标明那个用户,和时间)

    ---》redis

    --》入库程序

    ---》数据库


    代码及设计

    1.秒杀程序把请求写入redis(uid,time_stamp微秒时间戳)

    2.检查redis已存入数据的长度,超出上限直接丢弃

    3.死循环处理存入redis的数据并入库


    实现:

    存入redis:

    先加载redis组件 


    $redis = new Redis();

    $redis->connect(ip);

    $redis_name='miaosha';


    接受用户uid

    $uid = $_GET['uid'];


    获取一个redis里面已经有的数量

    $num = 10;

        


    如果当天人数少于10的时候,加入队列

    if($redis->ILen($reids_name) < 10){

        

        $redis->rFlush($redis_name,$uid.'%'.microtime())

        echo '秒杀成功';

    }{

        返回秒杀已完成

    }


    $redis->close();

    处理程序,写入数据库:


    加载redis组件


    //死循环

    从队列最左侧取出一个值来,然后判断这个值是否存在,切割出时间,uid,保存到数据库中,数据库插入失败的时候回滚机制 ,释放redis


    whlie(1){

        $user = $redis->IPop($redis_name)//左侧取值

        if(!$user || $user == 'nil'){

            sleep(2);

            continue;

            

        }

        $user_arr = explode('%',$user);

        $insert_data = arraya(

            'uid'=>$user_arr[0];

            'time'=>$user_arr[1];

            //入库操作  insert $res

            

            if(!$res){

               $redis->rPush($redis_name,$user); 

            }

        );

    }


    $redis->close();



    如何在服务器使用:

    先 cd 到需要执行的文件目录,ls确认 

    php savetodb.php


关键字词: 消息队列介绍demo,消息队列应用场景demo

0
Name::

Email:


留言内容: