Reactor線程模型
- Reactor單線程模型
所有的I/O操作都由同一個NIO線程完成。只適合小容量應用場景。不適合高負載大并發的應用場景。原因如下:
a、 一個NIO線程同時處理成百上千條線路,性能上無法支撐,即使CPU使用率達到百分之百,也無法滿足海量消息編解碼、讀取、發送。
b、 當NIO線程負載過重后,處理會變慢,導致大量客戶端連接超時,而超時可能重發,導致越來越積壓嚴重。
c、 可靠性問題,一旦NIO線程跑飛了或者進入死循環,整個系統通信都不可用了,造成單點故障。 - Reactor多線程模型
由一組NIO線程來處理I/O操作。特點如下:
a、 有專門一個NIO線程--Acceptor線程用來監聽服務端,接收客戶端的TCP連接請求。
b、 網絡IO操作--讀寫等由一個NIO線程池負責,線程池可以采用標準的JDK線程池實現,它包含一個任務隊列和N個可用的線程,由這些NIO線程來完成消息的讀取、發送和編解碼操作。
c、 一個NIO線程可以同時處理N條鏈路。但是同一個鏈路只對應一個NIO線程,防止發生并發操作問題。
在絕大多數場景下,Reactor多線程模型可以滿足性能要求。但是,個別特殊場景中,一個NIO線程負責監聽和處理所有的客戶端連接可能會存在性能問題。例如并發百萬客戶端連接,或者服務端需要對客戶端握手進行安全認證,但是認證本身非常損耗性能。 - 主從Reactor多線程模型
特點是:服務端用來接收客戶端連接的不再是一個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求并處理完成后,將新創建的SocketChannel注冊到IO線程池的某個IO線程上,由它負責SocketChanel的讀寫和編解碼操作。Acceptor線程池僅僅用于客戶端的登錄、握手和安全認證,一旦鏈路創建成功,就將鏈路注冊到后端的線程池中的Io線程上,有IO線程負責后續的操作。