匠心零度 轉載請註明原創出處,謝謝!react
《易筋經》。天下武功出少林,而易筋經是少林寺的鎮寺之寶。學好了易筋經就能夠輕易地學好其它武功,只不過不多人學到了它的所有精髓。遊坦之只是碰巧學了一點點就變成了武林高手,從中能夠看出易筋經的威力的確很大。程序員
以前已經寫過三篇NIO文章,NIO相關基礎篇一、NIO相關基礎篇二、NIO相關基礎篇三,今天咱們來提下NIO中的易筋經Reactor模型。編程
不會說故事的程序員不是好廚子,下面就來聽聽故事吧。服務器
故事改編與網絡。網絡
以A地公衆號:匠心零度菜館爲例,以客人就餐爲例。
咱們服務對象以桌(一桌>=1)爲最小單位多線程
公衆號:匠心零度菜館剛剛成立,客人還不是特別多的時候。
來一桌客人就餐,一個服務員去服務,而後客人會看菜單,點菜。 服務員將菜單給後廚。
來二桌客人就餐,二個服務員去服務……
……
來五桌客人就餐,五個服務員去服務……併發
公衆號:匠心零度菜館愈來愈忙,人愈來愈多,零度老闆開始着急了:
缺少彈性伸縮能力,當顧客愈來愈多,並行增長以後,服務員與顧客人數關係1:1關係。
如今人員太貴,再請人就攢不到錢了,當顧客到達必定以後零度就承擔不了聘用那麼的工做人員了,要否則公衆號:匠心零度菜館會垮掉了。app
零度思來想去:
算了下成本,零度決定只聘用十個服務員。
這樣當顧客愈來愈多,並行增長以後,服務員與顧客人數關係10:N(N大於等於10)關係。
這樣公衆號:匠心零度菜館也不會由於聘用人員太多而承擔不起。異步
那麼又有什麼問題呢? 若是某桌客人點菜很是慢,致使有些桌客人會一直等好久,當體驗很差的時候可能
有些桌的能夠立馬走了,有些桌的客人之後不來了。高併發
雖然錢省下來了,可是也沒有掙到,零度又開始想辦法了,看看下面的故事二吧。
哈哈哈哈,零度以前是幹編程的,知道不少事情須要拆拆拆(特別在中國要是拆房子,那不得了啊,發啦!!!)
上面的事情因爲全部的事情都是一個服務器從頭負責到尾,而有不少時候,顧客在交流討論的時候,服務員其實
沒啥事情乾的,就在那裏等着(能不能讓等的時候去作其餘事情呢,充分利用起來呢???)。
零度思來想去:
終於發現了一個新的方法,那就是:
當客人點菜的時候,服務員就能夠去招呼其餘客人了,等客人點好了菜,直接招呼一聲"服務員",
立刻就有個服務員過去服務。以後零度進行了一次裁人,只留了一個服務員!
這樣公衆號:匠心零度菜館生意愈來愈好,又出現了二個問題:
就算該服務員在怎麼忙,也沒法應對成百上千桌的客人了。
一個服務員若是請假或者有事情怎麼辦?(常常說服務不要出現單點,這樣也同樣啊!!!)
雖然錢省下來了,可是該掙的錢沒有掙到,零度又開始想辦法了,看看下面的故事三吧。
零度決定公衆號:匠心零度菜館再聘二名服務員,如今有三名服務員了,零度給他們劃分是
一個負責填寫各各桌的菜單,另外二名負責端菜(上菜的忙些),接下來的生意都很好,也忙的過來,請假了,另外二個相互配合下
臨時處理也來得及,因爲這樣,生意愈來愈好,有一次被不倫不類的人進來了,搞的公衆號:匠心零度菜館事情很大。
若是服務員還要檢查人員,那麼又忙不開了。
零度又開始思考了,看看下面的故事四吧。
零度聘了一個保安,須要檢查下是否爲不倫不類人員,若是不是,把他交給服務員讓服務員帶入,以後服務員帶入
繼續由客人直接招呼一聲"服務員"點菜好了,以後由其餘服務員端菜……生意很好。
已經到了一個公衆號:匠心零度菜館忙不過來了 (到達上限了,那麼要擴了,開分店……)
零度,反正之前幹編程的,本身開發了一個app,客人過來以前就已經網上下單,零度專門找了一我的負責這塊,當app有
新訂單的時候會有聲音提醒,那個負責人告訴後廚,這樣當沒有提醒的時候,該負責人能夠去幫忙照顧店裏的客人……
編不下去了…………
本文最重要的參考文獻是Doug Lea大神的"Scalable IO in Java」,搜索公衆號【匠心零度】或者掃描最下方二維碼進行關注,回覆:nio ,獲取該資料,建議電腦下載,下文中的截圖也是截取自中。
BIO主要的問題在於每當有一個新的客戶端請求接入時,服務端必須建立一個新的線程來處理這條鏈路,在須要知足高性能、高併發的場景是無法應用的(大量建立新的線程會嚴重影響服務器性能,使用線程池也是存在問題,若是發生大量併發請求,超過最大數量的線程就只能等待,會一直阻塞)
單線程模型會存在若是連接太多,性能可能沒法知足,並且若是nio線程出現意外啥的會影響這個系統不可用。
多線程模型通常場景都知足了,可是在特別高的併發,以及一些很是消耗性能的驗證等,會存在一些不足之處。
主從多線程模型,經過mainReactor線程、subReactor線程繼續拆分,mainReactor線程負責一些客戶端TCP鏈接請求預處理(驗證等),subReactor線程處理真正的IO。
參考:
http://daimojingdeyu.iteye.com/blog/828696
本人水平有限,不免會有一些理解誤差的地方,若是發現,歡迎各位積極指出,感謝!!!
若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【匠心零度】,查閱更多精彩歷史!!!