我知道這是一個反覆出現的問題,我已經閱讀了如下文章http://www.mailinator.com/tymaPaulMultithreaded.pdf這樣的說法,它不一定是真的,尼奧比io好。java.nio對於Web服務器有什麼好處?
但我很努力地看到,如何在開發web服務器時比傳統的acceptor/worker線程體系結構更好地擴展java nio?讓我來解釋:
一般的Java Web服務器使用下面的模式來處理連接:
限於核心數量的一些接收器線程塊上的ServerSocket的accept()方法:
while (true) { socket = serverSocket.accept(); // handleRequest submits the socket to a queue handleRequest(socket); socket.close(); }
當檢索到客戶端套接字時,會將其提交到非阻塞隊列,然後由工作線程池中的工作線程處理。工作線程的數量取決於正在執行的io操作的持續時間。
如何使用java.nio使這種架構更具可擴展性?
我的意思是我仍然需要工作線程來處理阻塞操作(訪問數據庫或文件系統,調用外部服務)的請求。如果後端操作不像node.js中那樣異步執行,我仍然需要工作線程來限制整個可伸縮性與1或2個事件分派器線程。
當您有長時間空閒的連接時,NIO更有用。因此,例如,大量使用長輪詢的應用程序可以使用NIO處理更多的請求,而不是使用IO處理更多請求,而每個長輪詢連接阻塞並關聯線程。有了NIO,情況並非如此。 – 2013-04-06 11:12:11
爲了減少線程數 - 更多的線程,更多的系統調用。 – coolcfan 2013-04-08 09:08:39