【面試題】研究過tomcat的NioEndpoint源碼嗎?請闡述下Reactor多線程模型在tomcat中的實現。

tomcat的底層網絡NIO通信基於主從Reactor多線程模型

它有三大線程組分別用於處理不同的邏輯:

Acceptor線程:等待和接收客戶端連接。在接收到連接後,創建SocketChannel並將其註冊到poller線程。 

poller線程:將SocketChannel放到selector上註冊讀事件,輪詢selector,獲取就緒的SelectionKey,並將就緒的SelectionKey(或SocketChannel)委託給工作線程。 

工作線程:執行真正的業務邏輯。 備註:Acceptor線程和poller線程之間有一個SocketChannel隊列,Acceptor線程負責將SocketChannel推送到隊列,poller線程負責從隊列取出SocketChannel。poller線程從隊列取出SocketChannel後,緊接着會把它放到selector上註冊讀事件。

主從Reactor多線程模型 主從Reactor線程模型的特點是:服務端用於接收客戶端連接的不再是1個單獨的NIO線程,而是一個獨立的NIO線程池。Acceptor接收到客戶端TCP連接請求處理完成後(可能包含接入認證等),將新創建的SocketChannel註冊到IO線程池(sub reactor線程池)的某個IO線程上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor線程池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路註冊到後端subReactor線程池的IO線程上,由IO線程負責後續的IO操作。

它的線程模型如下圖所示:

 

工作流程總結如下

從主線程池中隨機選擇一個Reactor線程作爲Acceptor線程,用於綁定監聽端口,接收客戶端連接; Acceptor線程接收客戶端連接請求之後創建新的SocketChannel,將其註冊到主線程池的其它Reactor線程上,由其負責接入認證、IP黑白名單過濾、握手等操作; 步驟2完成之後,業務層的鏈路正式建立,將SocketChannel從主線程池的Reactor線程的多路複用器上摘除,重新註冊到Sub線程池的線程上,用於處理I/O的讀寫操作。

另附:tomcat源碼級調優文檔:

https://smartan123.github.io/book/?file=001-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/002-%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/0021-tomcat%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章