天天看點

Php消息隊列實作

隊列的概念:

1、是隊列結構的中間件

2、消息放入後不需要立即處理

3、由訂閱者/消費者按順序處理

隊列原理:

Php消息隊列實作

也是解耦的原理:業務系統和隊列處理系統沒有關系

一個寫(業務系統),一個讀(隊列管理系統)。

寫的隻管往隊列裡寫,别的不用操心,讀的能不能讀完和寫的也沒有關系

同樣,讀的隻管從隊列裡往外讀,來活兒就幹,沒活兒歇着

應用場景:

備援:持久化的存儲在隊列中,後續由訂單處理程式擷取,處理完成之後,在把這條記錄進行删除

解耦:是解這2套系統(業務和隊列處理),我們平常做的都是一套系統的。入隊和出隊的系統沒有直接的關系,其中一套蹦了,另一套系統不會受影響,因為中間隔了個隊列

流量削鋒:秒殺和搶購。流量劇增,配合緩存使用消息隊列(就是限制下,如 隻允許10個,隊列裡存10個之後就不存了,在來就提示秒殺結束)

異步通信:因為消息本身就可使入隊的系統直接傳回,是以說實作了程式的異步操作

場景擴充性:如 現在隻有訂單系統和财務系統,後續我想加個配貨系統,直接讓配貨系統訂閱這個隊列就可以

排序保證:有些場景下,如 銀行資料的處理順序是很重要的,因為隊列本身就可以做成單線程,單進單出的這種系統

實作媒體:

1、使用mysql:可靠性高,易實作,速度慢

2、使用redis:速度快,單條大消息包時效率低

3、使用更專業的第三方類庫:專業性強,可靠,學習成本高。

請參考我這篇部落格http://blog.csdn.net/qq_33862644/article/details/79386484

消息處理觸發機制:

1、死循環方式讀取:易實作,故障時無法及時回複(适用于秒殺這種短時間的)

2、定時任務:壓力均分,有處理上限(無論你隊列前的系統,峰值多麼不穩定,隊列後的系統依然會定時執行)

注意:定時時間是個關鍵:不要上一個還定時任務沒執行完,下一個定時任務就啟動了

案例:訂單系統,下單後将訂單資訊寫入隊列後,立刻傳回下單成功。配貨系統每隔幾分鐘定時讀取隊列,對訂單進行彙總處理

3、守護程序:類似于php-fpm和cgi,需要shell基礎(用這個程序來檢測,隊列中是否有内容,有内容的話,啟動出隊系統進行處理)

使用mysql實作解耦案例:

為什麼要解耦:如果架構在一起。訂單系統壓力大,而物流資訊是不需要立刻傳回的。訂單崩了,物流也就蹦了,是以要解耦

Php消息隊列實作

表的設計:

Php消息隊列實作

訂單系統寫入隊列的代碼:

Php消息隊列實作

配貨系統讀取隊列的代碼:

Php消息隊列實作

執行定時任務Crontab -e

Php消息隊列實作

注意:這日志檔案要自己建立

Php消息隊列實作

1、通過浏覽器通路order.php添加訂單

2、去資料庫看結果,在shell中的日志中看結果(沒有執行成功,可能是這sh檔案需要放在某個特點目錄吧,等複習完 在跑)

使用redis進行流量削鋒案例

Php消息隊列實作

思路:

1、秒殺程式請求寫入redis    

2、檢查redis已存放資料的長度,超出上限直接丢棄(傳回秒殺結束)

3、死循環處理存入redis的資料并入庫

Php消息隊列實作

秒殺代碼:

Php消息隊列實作

入庫代碼:

Php消息隊列實作