详解PHP消息队列的实现以及运用(附流程图)

消息队列的概念、原理、实现方式

概念

  • 队列结构的一个中间件
  • 不需要立即消费消息
  • 由消费者或者订阅者进行按顺序消费

基本的流程图如下所示

  • 流程
    ca434f67a2b74693d8a8db235ff9d3d.jpg

应用场景

  • 冗余
  • 解耦
  • 流量削峰
  • 异步通信

实现方式

  • mysql:可靠、速度慢
  • redis:速度快,对于大消息包处理较慢
  • 消息系统:可靠、专业性强

消息的触发机制

  • 死循环的方式,故障时无法及时恢复
  • 定时任务:压力均分、但是处理量有上限
  • 守护进程的方式

解耦 (订单和配送系统)

  • 架构设计1 采用定时任务的方式
    1013f8bafa2312f0f60c2f8253eb0f2.jpg

    php入门到就业线上直播课:进入学习
    Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用

  • 使用配送处理系统进行处理时,将当前数据库里需要处理的订单状态更新为2,待处理完成后将状态设为1

  • 可以每次指定更新多少条数据

流量削锋 (redis实现秒杀)

  • 使用队列的数据结构

    • lpush/rpush 将数据放入列表中
    • lpop/rpop 将数据移除列表并获取到移除的值
    • ltrim 保留指定区间内的元素
    • llen 获取列表长度
    • lset 通过索引设置列表的值
    • lindex 通过索引获取列表中的值
    • lrange 获取指定范围的元素
  • 图示如下
    03e20c9fdf5009f0ad7383988c42c6f.jpg

  • 代码流程如下

    • 秒杀程序将请求写入redis(uid,time)

    • 检查redis列表存放的长度,超过10个直接舍弃

    • 通过死循环读取redis数据,并存入数据库

      // Spike.php 秒杀程序if(Redis::llen('lottery') < 10){
          // 成功
          Redis::lpush('lottery', $uid.'%'.microtime());}else{
          // 失败}

      登录后复制

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 详解PHP消息队列的实现以及运用(附流程图)
温馨提示您:本站所载文章、数据仅供参考,如果有文章侵犯了您的权益,请来信告知我们删除,联系邮箱:976157886@qq.com
Copyright © 2023 自学咖网 - All rights reserved 浙ICP备2023005527号