PHP消息队列实现及应用
概念
消息队列概念
- 队列结构的中间件
- 消息放入后,不需要立即处理
- 由订阅者/消费者按顺序处理
业务系统
入队数据至消息队列
,队列处理系统
依次出队数据,进行处理
应用场景
- 冗余
- 解耦
- 流量削峰(秒杀,定时开售)
- 异步通信
- 扩展性(新增模块只需订阅该消息队列)
- 排序保证
优缺点
- Mysql:可靠性高、易实现,速度慢
- Redis:速度快,单条大消息包时 效率低
- 消息系统:专业性强、可靠,学习成本高
消息处理触发机制
- 死循环方式读取:易实现,故障时无法及时恢复(秒杀类短时间的可采用)
- 定时任务(一段时间内触发):压力均分,有处理量上限(流行)
- 守护进程:类似于PHP-FPM和PHP-CG,需要shell基础
解耦案例
队列处理订单系统和配送系统
![](https://img2020.cnblogs.com/blog/747395/202107/747395-20210720161840821-2124302604.png)
流量削峰案例:Redis的List类型实现秒杀
Redis的List
双向链表
- LPUSH/LPUSHX: 插入至头部
- RPUSH/RPUSHx: 插入至尾部
- LPOP: 移出并获取列表的第一个元素
- RPOP: 移出并获取列表的最后一个元素
- LTRIM:保留指定区间内的元素
- LLEN:获取列表长度
- LSET:通过索引设置列表元素的值
- LINDEX:通过索引获取列表中的元素
- LRANGE:获取列表指定范围内的元素
架构设计
![](https://img2020.cnblogs.com/blog/747395/202107/747395-20210720163623643-1258327349.png)
代码级设计
- 秒杀程序把请求写入Redis(Uid,time_stamp)
- 检查Redis已存放数据的长度,超出上限直接丢弃
- 死循环处理存入Redis的数据并入库
RabbitMQ
RabbitMQ的架构和原理
![](https://img2020.cnblogs.com/blog/747395/202107/747395-20210720164740957-995410042.png)
ps: AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
- RabbitMQ安装(rabbitmq-server、php-amqplib)
- 生产者向消息通道发送消息
- 消费者处理消息