消息隊列的場景
我們都知道,消息是在兩臺計算機之間傳送的數據單位,這個“消息”可以非常簡單,例如只包含文本字符串,也可以更復雜,可能包含嵌入對象。而所謂的“消息隊列”是在消息的傳輸過程中保存消息的容器。在web程序中,可能我們需要將用戶的請求數據更新或者添加到數據庫中,但是在高炳發的情況下,雖然作為用戶的我們不知道后臺是什么原因,但是依舊會抱怨或者吐槽這個程序反應緩慢,比如在過去的幾年里,你有沒有吐槽過12306搶票很難?反應很慢?有沒有在使用某個程序的時候收到“service is too busy”,而這其實是因為當時的并發訪問過量,超過了系統的最大負載能力。當然我們可以通過添加服務器集群中服務器的數量來增加程序的負載能力。
過度耦合的缺點:php應用中,過度的耦合使得系統拓展性變弱,聯動性錯誤。
今天我給大家介紹的是利用redis的隊列消息實現模塊間的解耦。
應用場景:用戶在采購模塊下單買了一批貨物回來,簽收時要在倉庫模塊添加相應的庫存,普通的做法就是在簽收完成的時候通過接口給倉庫模塊推送數據執行入庫操作。但是這么做如果倉庫模塊發送錯誤,沒有入庫成功就會導致采購模塊簽收失敗,這就是耦合給系統帶來的缺點。
解決方案:運用php+redis隊列消息的技術,當用戶簽收成功的時候,把數據放入隊列中,入列成功采購模塊則返回簽收成功的提示給用戶,后續的操作都不需要采購模塊操心,然后倉庫系統可以通過redis的訂閱發布模式來進行監聽,當有數據入列,則倉庫系統就執行入庫邏輯代碼的
運行。
關鍵點:
1、如果redis服務器掛掉了怎么辦???
在采購模塊的簽收邏輯代碼中做判斷,如果入列成功則返回簽收完成,如果入列失敗這運行傳統方法,通過接口入庫的方法。如果redis也掛了,倉庫模塊也掛了怎么辦啊,那你就收拾包袱回家吧。
2、如何實現傳統方式那樣實時入庫啊?
采用redis的訂閱發布模式就可以解決。訂閱的代碼放在倉庫模塊,發布的代碼放在采購模塊。
訂閱代碼sub.php
1
2
3
4
5
|
<?php $redis = new Redis(); $redis ->connect( 'localhost' , 6379); $redis ->subscribe([ 'ruku' ], function ( $redis , $chan , $msg ) { //訂閱入庫頻道 if($msg==2500){ //如果監聽到有發布信息則從隊列中拿取信息進行入庫操作 。。。。。。。 } }); |
發布代碼pub.php
1
2
3
4
5
|
<?php $redis = new Redis(); $redis ->connect( 'localhost' , 6379); $order = [ 'id' => 1, 'name' => '小米6' , 'price' => 2499, 'created_at' => '2017-07-14' ]; $redis ->lpush( 'order' , $order ); $redis ->publish( "ruku" , 2500); |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/maccc/p/9641132.html