详解PHP消息队列的实现以及运用(附流程图)
消息队列的概念、原理、实现方式
概念
- 队列结构的一个中间件
- 不需要立即消费消息
- 由消费者或者订阅者进行按顺序消费
基本的流程图如下所示
- 流程
应用场景
- 冗余
- 解耦
- 流量削峰
- 异步通信
实现方式
- mysql:可靠、速度慢
- redis:速度快,对于大消息包处理较慢
- 消息系统:可靠、专业性强
消息的触发机制
- 死循环的方式,故障时无法及时恢复
- 定时任务:压力均分、但是处理量有上限
- 守护进程的方式
解耦 (订单和配送系统)
-
架构设计1 采用定时任务的方式
php入门到就业线上直播课:进入学习
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用 -
使用配送处理系统进行处理时,将当前数据库里需要处理的订单状态更新为2,待处理完成后将状态设为1
-
可以每次指定更新多少条数据
流量削锋 (redis实现秒杀)
-
使用队列的数据结构
- lpush/rpush 将数据放入列表中
- lpop/rpop 将数据移除列表并获取到移除的值
- ltrim 保留指定区间内的元素
- llen 获取列表长度
- lset 通过索引设置列表的值
- lindex 通过索引获取列表中的值
- lrange 获取指定范围的元素
-
图示如下
-
代码流程如下
-
秒杀程序将请求写入redis(uid,time)
-
检查redis列表存放的长度,超过10个直接舍弃
-
通过死循环读取redis数据,并存入数据库
// Spike.php 秒杀程序if(Redis::llen('lottery') < 10){ // 成功 Redis::lpush('lottery', $uid.'%'.microtime());}else{ // 失败}
登录后复制
-