1. 程式人生 > 資料庫 >redis中佇列訊息實現應用解耦的方法

redis中佇列訊息實現應用解耦的方法

訊息佇列的場景

我們都知道,訊息是在兩臺計算機之間傳送的資料單位,這個“訊息”可以非常簡單,例如只包含文字字串,也可以更復雜,可能包含嵌入物件。而所謂的“訊息佇列”是在訊息的傳輸過程中儲存訊息的容器。在web程式中,可能我們需要將使用者的請求資料更新或者新增到資料庫中,但是在高炳發的情況下,雖然作為使用者的我們不知道後臺是什麼原因,但是依舊會抱怨或者吐槽這個程式反應緩慢,比如在過去的幾年裡,你有沒有吐槽過12306搶票很難?反應很慢?有沒有在使用某個程式的時候收到“service is too busy”,而這其實是因為當時的併發訪問過量,超過了系統的最大負載能力。當然我們可以通過新增伺服器叢集中伺服器的數量來增加程式的負載能力。

過度耦合的缺點:php應用中,過度的耦合使得系統拓展性變弱,聯動性錯誤。

今天我給大家介紹的是利用redis的佇列訊息實現模組間的解耦。

應用場景:使用者在採購模組下單買了一批貨物回來,簽收時要在倉庫模組新增相應的庫存,普通的做法就是在簽收完成的時候通過介面給倉庫模組推送資料執行入庫操作。但是這麼做如果倉庫模組傳送錯誤,沒有入庫成功就會導致採購模組簽收失敗,這就是耦合給系統帶來的缺點。

解決方案:運用php+redis佇列訊息的技術,當用戶簽收成功的時候,把資料放入佇列中,入列成功採購模組則返回簽收成功的提示給使用者,後續的操作都不需要採購模組操心,然後倉庫系統可以通過redis的訂閱釋出模式來進行監聽,當有資料入列,則倉庫系統就執行入庫邏輯程式碼的

執行。

關鍵點:

1、如果redis伺服器掛掉了怎麼辦啊?

在採購模組的簽收邏輯程式碼中做判斷,如果入列成功則返回簽收完成,如果入列失敗這執行傳統方法,通過介面入庫的方法。如果redis也掛了,倉庫模組也掛了怎麼辦啊,那你就收拾包袱回家吧。

2、如何實現傳統方式那樣實時入庫啊?

採用redis的訂閱釋出模式就可以解決。訂閱的程式碼放在倉庫模組,釋出的程式碼放在採購模組。

訂閱程式碼sub.php

<?php
$redis = new Redis();
$redis->connect('localhost',6379);
$redis->subscribe(['ruku'],function ($redis,$chan,$msg) {//訂閱入庫頻道   if($msg==2500){   //如果監聽到有釋出資訊則從佇列中拿取資訊進行入庫操作    。。。。。。。  }  
});

釋出程式碼pub.php

<?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);

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。