主要内容:
-
消息队列的概念、原理和场景
-
解耦案例:队列处理订单系统和配送系统
-
流量削峰案例:Redis的List类型实现秒杀
-
RabbitMQ:更专业的消息系统实现方案
一、PHP消息队列实现及应用:
-
消息队列概念:
-
队列结构的中间件
-
消息放入后,不需要立即处理
-
由订阅者/消费者按顺序处理
-
-
核心结构:
-
业务系统 ---入队 ---> 消息队列 ---出队---> 队列处理系统
-
-
应用场景:
-
冗余【数据需要冗余处理的时候】
-
解耦【解决了两套以上系统深度耦合的关系】
-
流量削峰
-
异步通信
-
扩展性
-
排序保证
-
-
队列介质:
-
Mysql:可靠性高,易实现,速度慢
-
Redis:速度快,单条大消息包时效率低
-
消息系统:专业性强,可靠,学习成本高【RabbitMQ】
-
-
消息处理触发机制:
-
死循环方式读取:易实现,故障时无法及时恢复
-
定时任务,压力均分,有处理量上限【推荐】
-
守护进程,类似于PHP-FPM和PHP-CG,需要shell基础
-
解耦案例:队列处理订单系统和配送系统
-
架构设计:
-
三、流量削峰案例:Redis的List类型实现秒杀
-
Redis数据类型中的list类型
-
LPUSH/LPUSHX:将值插入到(存在的)列表头部
-
RPUSH/RPUSHX:将值插入到(存在的)列表尾部
-
LPOP:移出并获取列表中的第一个元素
-
RPOP:移出并获取列表中的最后一个元素
-
LTRIM:保留指定区间内的元素
-
LLEN:获取列表长度
-
LSET:通过索引设置列表中元素的值
-
LINDEX:通过索引获取列表汇总的元素
-
LRANGE:获取列表中区间内的元素
-
-
-
代码级设计:
-
秒杀程序把请求写入Redis。
-
检查Redis已存放数据的长度,超出上限直接丢弃
-
死循环处理存入Redis的数据并入库
-
四、RabbitMQ:更专业的消息系统实现方案
-
特点:完整的实现了AMQP、集群简化,持久化,跨平台
-
RabbitMQ使用:
-
RabbitMQ安装(rabbitmq-server、php-amqplib)
-
生产者向消息通道发送消息
-
消费者处理消息
-