我知道这是一个经常出现的问题,并且我读过类似以下http://www.mailinator.com/tymaPaulMultithreaded.pdf的文章,说 nio 的扩展性比 io 好不一定是真的。
但是我很难看到在开发 Web 服务器时 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 个事件调度程序线程。