上次講到事件驅動模式,今天咱們來好好分析下netty的事件模式的幾個類型。react
先從NIO講起,vim
JAVA NIO方面Selector給Reactor模式提供了基礎,Netty結合Selector和Reactor模式設計了高效的線程模型。網絡
這裏有個題外話,reactor英文的含義是什麼?咱們能夠稍微瞭解下:多線程
中文翻譯是反應者,在咱們這個語境,翻譯成反應者或響應者,都是正解。就把它想象成KFC的前臺服務員好,她就是一個響應者,也叫reactor.socket
如今咱們來看下Reactor模式圖:oop
如上圖所示,所謂的reactor模式,就是咱們上篇文章所說的,KFC先後服務員加後臺服務員的模式。spa
前臺服務員(同時表明上圖的demultiplexer和dispatcher)只負責接待客戶的點漢堡的請求和訂單分派,作漢堡的活讓後臺臺服務員(表明上圖的handler)去作。線程
作好後,後臺再通知前臺,由前臺轉交給客戶。翻譯
這個很好理解。設計
好,那咱們如今來看看Java NIO的reactor的幾個模式:單線程模式,多線程模式,主從模式。
先看單線程模式:
如上圖所示,所謂單線程模式,只有一個線程(acceptor)去處理客戶的請求,而後,這個線程還要作read,send等工做,至關因而個多面手。
就好像KFC前臺後臺都只有一個服務員。
這個模式,若是客戶只有一個的話,是能夠處理。但若是,是用餐高峯期,一會兒來了十個客戶,那就很差處理了。
怎麼辦?
很天然,咱們能夠增長後臺服務員,而且由於後臺的工做比較多,後臺服務員能夠多個。這就是多線程模式。
再看多線程模式圖:
如上圖所示,用線程池(多個服務員)去處理read,decode,compute,encode任務。
就好像,前臺一個服務員只負責下訂單,而後把訂單信息分派給多個後臺服務員,同時服務多個客戶,速度和效率也明顯好不少,客戶也不用等待過久。
那若是,這個時間來了幾十個客戶,若是隻有一個前臺服務員,這時,也處理不過來,怎麼辦?
很天然,增長前臺服務員的數量。固然咱們也不須要增長太多(畢竟有人力成本),如今咱們只增長一位好了。
兩位服務員,一主一從,咱們就叫主從模式。
咱們來看主從模式圖:
如上圖,將Reactor分紅兩部分,mainReactor負責監聽server socket,accept新鏈接;並將創建的socket分派給subReactor。subReactor負責多路分離已鏈接的socket,讀寫網絡數據,對業務處理功能,其扔給worker線程池完成。一般,subReactor個數上可與CPU個數等同。
仍是用KFC的例子來講明,其中mainReactor是服務員小黃,她只負責下訂單。subReactor就是服務員小張,他呢,只服務根據訂單信息分派給後臺服務員,並負責把漢堡和飲料放在托盤遞給客戶。
以上就是reactor模式說明,但願你已經明白了!
說完了Reactor的三種模型,那麼Netty是哪種呢?其實Netty的線程模型是Reactor模型的變種,那就是去掉線程池的第三種形式的變種,這也是Netty NIO的默認模式。Netty中Reactor模式的參與者主要有下面一些組件:
Selector
EventLoopGroup/EventLoop
ChannelPipeline
Selector即爲NIO中提供的SelectableChannel多路複用器,充當着demultiplexer的角色,就像專門下訂單的前臺服務員。
ChannelPipeline負責安排Handler的順序及其執行。由於後臺工做多且雜,須要一個後臺管理員負責管理和編排後臺服務員的工做。這個後臺管理員就是ChannelPipeline。
EventLoop的目的是爲Channel處理IO操做,一個EventLoop能夠爲多個Channel服務。EventLoop就是後臺服務員,一個後臺服務員能夠同時作幾份漢堡。
EventLoopGroup會包含多個EventLoop。EventLoopGroup就是後臺服務員的班組,幾個後臺服務員一個班組,一個班組固定處理一個固定 的後臺工做。
明天繼續。
s