PHP消息队列实现及应用

概念

消息队列概念

  • 队列结构的中间件
  • 消息放入后,不需要立即处理
  • 由订阅者/消费者按顺序处理

业务系统入队数据至消息队列队列处理系统依次出队数据,进行处理

应用场景

  • 冗余
  • 解耦
  • 流量削峰(秒杀,定时开售)
  • 异步通信
  • 扩展性(新增模块只需订阅该消息队列)
  • 排序保证

优缺点

  • Mysql:可靠性高、易实现,速度慢
  • Redis:速度快,单条大消息包时 效率低
  • 消息系统:专业性强、可靠,学习成本高

消息处理触发机制

  • 死循环方式读取:易实现,故障时无法及时恢复(秒杀类短时间的可采用)
  • 定时任务(一段时间内触发):压力均分,有处理量上限(流行)
  • 守护进程:类似于PHP-FPM和PHP-CG,需要shell基础

解耦案例

队列处理订单系统和配送系统

流量削峰案例:Redis的List类型实现秒杀

Redis的List双向链表

  • LPUSH/LPUSHX: 插入至头部
  • RPUSH/RPUSHx: 插入至尾部
  • LPOP: 移出并获取列表的第一个元素
  • RPOP: 移出并获取列表的最后一个元素
  • LTRIM:保留指定区间内的元素
  • LLEN:获取列表长度
  • LSET:通过索引设置列表元素的值
  • LINDEX:通过索引获取列表中的元素
  • LRANGE:获取列表指定范围内的元素

架构设计

代码级设计

  • 秒杀程序把请求写入Redis(Uid,time_stamp)
  • 检查Redis已存放数据的长度,超出上限直接丢弃
  • 死循环处理存入Redis的数据并入库

RabbitMQ

RabbitMQ的架构和原理

ps: AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

  • RabbitMQ安装(rabbitmq-server、php-amqplib)
  • 生产者向消息通道发送消息
  • 消费者处理消息
posted @ 2021-07-20 17:14  Au_ww  阅读(226)  评论(0编辑  收藏  举报