php隊列處理:php訊息佇列實現原理(圖文)

來源:互聯網
上載者:User
php隊列是什麼意思?怎麼實現的?有哪些應用情境?以下通過使用mysql實現解耦案例和使用redis進行流量削鋒案例詳細講解php訊息佇列的實現原理。

隊列的概念:

1、是隊列結構的中介軟體

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

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

隊列原理:

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

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

寫的只管往隊列裡寫,別的不用操心,讀的能不能讀完和寫的也沒有關係

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

應用情境:

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

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

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

非同步通訊:因為訊息本身就可使入隊的系統直接返回,所以說實現了程式的非同步作業

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

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

實現介質:

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

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

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

訊息處理觸發機制:

1、死迴圈方式讀取:易實現,故障時無法及時回複(適用於秒殺這種短時間的)

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

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

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

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


使用mysql實現解耦案例:

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

表的設計:

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

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

執行定時任務Crontab -e


注意:這記錄檔要自己建立


1、通過瀏覽器訪問order.php添加訂單

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


使用redis進行流量削鋒案例



思路:

1、秒殺程式請求寫入redis

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

3、死迴圈處理存入redis的資料併入庫

表的設計:


秒殺代碼:


入庫代碼:


瀏覽器直接存取user.php

在shell中使用php -f savetodb.php

去資料庫查看

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.