隊列使用場景:爲何須要隊列

在web開發中,咱們常常會遇到須要處理批量任務的時候,這些批量任務多是用戶提交的,也多是當系統被某個事件觸發時須要進行批量處理的,面對這樣的任務,若是是用戶提交的批量任務,初級程序員只能讓用戶觸發提交動做後,等待服務器處理完畢,而且將結果返回到瀏覽器,期間用戶不能關掉瀏覽器窗口,若是數據比較大,或者處理速度比較慢,那用戶體驗將會所以受到直接影響。

可是當咱們使用某訊或者某浪的郵箱時,點擊羣發郵件以後,只需等待很短的時間,瀏覽器提示提交成功,正在發送之類的信息時,用戶就能夠關掉瀏覽器,稍後,收件地址欄裏的郵箱將陸續收到該羣發郵件,再好比羣發定時郵件,以及當商城系統中有客戶下單,客戶,客服,倉庫等相關人員收到訂單郵件信息。諸如此類,隊列的應用範圍是如此之廣。二 :普通工程師的解決方案和架構師的解決方案

方案1:建表存郵件,消息等,用定時程序取出發送。

方案2:抽象到更高一層,開發一套通用異步處理隊列適用於任何複雜的業務邏輯 那麼,做爲架構師,使用隊列的作法,將抽象層和業務層分離,可具備良好的擴展性和可維護性。相比較而言就高明瞭許多,下面就咱們介紹一下*定義隊列的實現思路和方法。

三 :隊列整體設*

    1:須要隊列程序,提供加入隊列接口和取隊列接口等

    2:須要存儲隊列,文件或者數據庫

    3:須要定時程序取出隊列並執行

    4:其它擴展功能:優先級,日誌,定時等  咱們這裏的隊列實現藉助了服務器的*劃任務來實現,例如linux中的crontab

這自己是linux系統中的一個程   這裏面幾個須要注意的地方

     1:往數據庫中存取數據時,不要直接使用json_encode或者json_decode,容易形成一些意外問題,在代碼中,咱們定義了a2s和s2a兩個方法,分別是處理數組轉爲字符串,和從數據庫中讀取字符串後轉爲數組。

     2:當任務量比較大,同時服務器負載又沒有充分利用的時候,可使用多進程併發處理, 在併發處理的時候須要考慮一個問題,就是如何避免重複,在這裏咱們使用了,對隊列任務進行標記,每次從數據庫中讀取一個進程須要處理的一批任務,使用數據庫中id與批次標示取餘等於0的方法來區分,避免不一樣批次的隊列,重複處理相同任務。 linux

相關文章
相關標籤/搜索