無論是C++還是Java編寫的網絡框架,大多數都是基於Reactor模式進行設計和開發,Reactor模式基於事件驅動,特別適合處理海量的I/O事件。
1. 單線程模型
Reactor單線程模型,指的是所有的IO操作都在同一個NIO線程上面完成,NIO線程的職責如下:
1)作為NIO服務端,接收客戶端的TCP連接;
2)作為NIO客戶端,向服務端發起TCP連接;
3)讀取通信對端的請求或者應答消息;
4)向通信對端發送消息請求或者應答消息。
Reactor單線程模型示意圖如下所示:
圖1-1 Reactor單線程模型
由於Reactor模式使用的是異步非阻塞IO,所有的IO操作都不會導致阻塞,理論上一個線程可以獨立處理所有IO相關的操作。從架構層面看,一個NIO線程確實可以完成其承擔的職責。例如,通過Acceptor類接收客戶端的TCP連接請求消息,鏈路建立成功之后,通過Dispatch將對應的ByteBuffer派發到指定的Handler上進行消息解碼。用戶線程可以通過消息編碼通過NIO線程將消息發送給客戶端。
對於一些小容量應用場景,可以使用單線程模型。但是對於高負載、大並發的應用場景卻不合適,主要原因如下:
1)一個NIO線程同時處理成百上千的鏈路,性能上無法支撐,即便NIO線程的CPU負荷達到100%,也無法滿足海量消息的編碼、解碼、讀取和發送;
2)當NIO線程負載過重之后,處理速度將變慢,這會導致大量客戶端連接超時,超時之后往往會進行重發,這更加重了NIO線程的負載,最終會導致大量消息積壓和處理超時,成為系統的性能瓶頸;
3)可靠性問題:一旦NIO線程意外跑飛,或者進入死循環,會導致整個系統通信模塊不可用,不能接收和處理外部消息,造成節點故障。
為了解決這些問題,演進出了Reactor多線程模型,下面我們一起學習下Reactor多線程模型。
2. 多線程模型
Rector多線程模型與單線程模型最大的區別就是有一組NIO線程處理IO操作,它的原理圖如下:
圖1-2 Reactor多線程模型
Reactor多線程模型的特點:
1)有專門一個NIO線程-Acceptor線程用於監聽服務端,接收客戶端的TCP連接請求;
2)網絡IO操作-讀、寫等由一個NIO線程池負責,線程池可以采用標准的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程負責消息的讀取、解碼、編碼和發送;
3)1個NIO線程可以同時處理N條鏈路,但是1個鏈路只對應1個NIO線程,防止發生並發操作問題。
在絕大多數場景下,Reactor多線程模型都可以滿足性能需求;但是,在極個別特殊場景中,一個NIO線程負責監聽和處理所有的客戶端連接可能會存在性能問題。例如並發百萬客戶端連接,或者服務端需要對客戶端握手進行安全認證,但是認證本身非常損耗性能。在這類場景下,單獨一個Acceptor線程可能會存在性能不足問題,為了解決性能問題,產生了第三種Reactor線程模型-主從Reactor多線程模型。
3. 主從多線程模型
主從Reactor線程模型的特點是:服務端用於接收客戶端連接的不再是個1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel注冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端subReactor線程池的IO線程上,由IO線程負責后續的IO操作。
它的線程模型如下圖所示:
圖1-3 主從Reactor多線程模型
利用主從NIO線程模型,可以解決1個服務端監聽線程無法有效處理所有客戶端連接的性能不足問題。因此,在Netty的官方demo中,推薦使用該線程模型。
它的工作流程總結如下:
- 從主線程池中隨機選擇一個Reactor線程作為Acceptor線程,用於綁定監聽端口,接收客戶端連接;
- Acceptor線程接收客戶端連接請求之后創建新的SocketChannel,將其注冊到主線程池的其它Reactor線程上,由其負責接入認證、IP黑白名單過濾、握手等操作;
- 步驟2完成之后,業務層的鏈路正式建立,將SocketChannel從主線程池的Reactor線程的多路復用器上摘除,重新注冊到Sub線程池的線程上,用於處理I/O的讀寫操作。
事實上,Netty的線程模型並非固定不變,通過在啟動輔助類中創建不同的EventLoopGroup實例並通過適當的參數配置,就可以支持上述三種Reactor線程模型。正是因為Netty 對Reactor線程模型的支持提供了靈活的定制能力,所以可以滿足不同業務場景的性能訴求。
參考資料
Netty系列之Netty高性能之道:http://www.infoq.com/cn/articles/netty-high-performance