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
服務也是不錯的,它是一個高性能、輕量級的分佈式內存隊列系統,讀者可自行了解一下。