Netty的基礎架構模型

codingtu發表於2017-08-14

Netty是高效能的非同步非阻塞NIO框架!

下面先來理解一下兩組關鍵的概念。

同步和非同步

拿方法呼叫來說,同步是指呼叫一個方法能夠在方法結束時立即得到方法的結果,非同步就是方法呼叫時沒有返回結果,由另外的執行緒去做方法中的事情,當前執行緒可以去做其他的事情。非同步呼叫的結果會通過中間狀態改變或者回撥函式等來通知。

拿一個生活的例子來說,同步就好比你去小區附近的一個4S點修車,老闆在幫你修車,你一直在旁邊等老闆修好位置,可能是等1個小時,也有可能是等2天;而非同步就好比你去修車,老闆說修好了給你打電話來取車,你會可以回家等了,老闆通過電話的形式來通知到你。

阻塞和非阻塞

用一個佇列來說,當你需要從佇列中獲取一個元素,如果當前佇列為空,那麼執行緒會一直在當前方法處於等待,執行緒會掛起。非阻塞則不會掛起!側重點在於執行緒是否會掛起。


基礎架構模型

在這個基礎架構模型中,建立了兩個執行緒池,這兩個執行緒池分別是boss執行緒池和worker執行緒池。在網路中,我們知道,一個連線過來,先要建立連線,然後再傳送和接收資訊。伺服器開啟時,boss執行緒池負責註冊ServerSocketChannel到當前selector,事件為OP_ACCEPT連線事件,專門負責客戶端請求的接收連線工作。boss執行緒池對於連線進來的SocketChannel,會交給worker執行緒池處理,worker執行緒池會將這個註冊SocketChannel到selector,事件為OP_READ事件,專門處理訊息的讀取工作。

一般情況下,boss執行緒池中執行緒數量較少,worker執行緒池中執行緒數量較多。


我們可以把這樣一個基礎框架模型比喻成飯店吃飯,一般來說,客戶去飯店吃飯,飯店有門口處的服務員接待客戶到飯桌上,把點餐、倒水、上菜等工作交給大廳服務員。門口服務員接待了客戶到飯桌上,就繼續回到門口接待下一個要來吃飯的客戶。而大廳服務員不可能是每一桌分配一個服務員,因為這樣比較浪費,而且並不是時時刻刻每一桌都會有事情叫服務員幫忙,所以一個大廳服務員可以服務多個飯桌的客戶,只要客戶叫到,服務員就來幫忙。這裡類似於selector的作用。


相關文章