【发布时间】:2013-04-06 10:57:54
【问题描述】:
我知道这是一个反复出现的问题,并且我读过类似以下 http://www.mailinator.com/tymaPaulMultithreaded.pdf 的文章,说 nio 的扩展性不一定比 io 好。
但是我很难看到在开发 Web 服务器时 java nio 如何比传统的接受器/工作线程架构更好地扩展?让我解释一下:
通常 Java Web 服务器使用以下模式来处理连接:
-
在ServerSocket的accept()方法上,一些受核数限制的acceptor线程:
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,情况并非如此。
-
减少线程数——更多的线程,更多的系统调用。
标签: java networking io nio