1.消息队列概念
1.1. 队列结构的中间件
1.2. 消息放入后,不需立即处理
1.3. 由订阅者/消费者按顺序处理
2.队列介质
2.1. Mysql:可靠性高,易实现,速度慢
2.2. redis:速度快,单条大消息包时效率低
2.3. 消息系统:专业性强、可靠、学习成本高(如RabbitMQ)
3.消息处理触发机制
3.1. 死循环方式读取:易实现,故障时无法及时恢复
3.2. 定时任务:压力均分,有处理量上限
3.3. 守护进程:类似于php-fpm、php-cg、supervisor,需要shell基础
4.应用
4.1. 解耦系统 - mysql
现在有订单系统和配送系统,需要使用队列消息把两个系统解耦出来
建立一个 mySql 的订单队列数据表,所有订单信息都会记录到这个订单表中,然后使用
crontab
定时把商品配送出去
4.2 商城秒杀活动 - Redis 的
list
消息队列:- 4.2.1. 秒杀程序把请求写入Redis、(Uid,time_stamp) 微秒:microtime()
- 4.2.2. 检查Redis已存放的长度,超出上限直接丢弃
- 4.2.3. 死循环处理存入Redis的数据并入库
4.3. RabbitMQ架构和原理 官网传送门
- 特定:完整的实现AMQP、集群简化、持久化、跨平台
RabbitMQ使用
- RabbitMQ 安装(rabbitmq-server、php-amqplib)
- 生产者向消息通道发送消息
- 消费者处理信息
PS:另外我觉得
beanstalkd
服务也是不错的,它是一个高性能、轻量级的分布式内存队列系统,读者可自行了解一下。