回覆列表
-
1 # 使用者2458114238191884
-
2 # 使用者8451710051916
Netty I/O執行緒和業務處理執行緒分離原因:
1、充分利用多核的並行處理能力:I/O執行緒和業務執行緒分離,雙方可以並行的處理網路I/O和業務邏輯,充分利用多核的平行計算能力,提升效能。
2、故障隔離:後端的業務執行緒池處理各種型別的業務訊息,有些是I/O密集型、有些是CPU密集型、有些是純記憶體計算型,不同的業務處理時延,以及發生故障的機率都是不同的。如果把業務執行緒和I/O執行緒合併,就會存在如下問題:
1)某類業務處理較慢,阻塞I/O執行緒,導致其它處理較快的業務訊息的響應無法及時傳送出去。
2)即便是同類業務,如果使用同一個I/O執行緒同時處理業務邏輯和I/O讀寫,如果請求訊息的業務邏輯處理較慢,同樣會導致響應訊息無法及時傳送出去。
3、可維護性:I/O執行緒和業務執行緒分離之後,雙方職責單一,有利於程式碼維護和問題定位。如果合設在一起,當RPC呼叫時延增大之後,到底是網路問題、還是I/O執行緒問題、還是業務邏輯問題導致的時延大,糾纏在一起,問題定位難度非常大。例如業務執行緒中訪問快取或者資料庫偶爾時延增大,就會導致I/O執行緒被阻塞,時延出現毛刺,這些時延毛刺的定位,難度非常大。
4、資源代價:NioEventLoopGroup的建立並不是廉價的,它會聚合Selector,Selector本身就會消耗控制代碼資源。
Netty的NioEventLoop設計理念就是透過有限的I/O執行緒,透過多路複用和非阻塞的方式,一個執行緒同時處理成百上千個鏈路,來解決傳統一連線一執行緒的同步阻塞模型。
因此,它的建立成本也較高,一個程序中不宜建立過多NioEventLoop。
多執行緒就象是人體一樣,一直在並行的做許多工作,例如,人可以同時呼吸,血液迴圈,消化食物的。多執行緒可以將一個程式劃分成多個任務,他們彼此獨立的工作,以方便有效的使用處理器和使用者的時間.這種比喻精闢,只要我們的機器資源夠用,就要儘量提高程式的執行速度,這樣能讓使用者感到舒服。
執行緒同步的方法:
wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。
sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉interruptedexception異常。
notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由jvm確定喚醒哪個執行緒,而且不是按優先順序。
allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。