带有阻塞应用程序的Tomcat NIO连接器



在阅读了Tomcat NIO连接器之后,我仍然不明白一件事:如果应用程序代码被阻塞,即它阻塞了从数据库读取、读取文件系统和调用外部web服务,那么NIO连接器是否有益?

因此,例如,您有一个类似REST的API,它接收一个请求,从数据库中读取一些内容,并返回一个响应。它不使用servlet 3异步,只是写入响应。

我没有找到NIO连接器使用的线程池的完整描述,但我认为它有一个用于处理请求的线程池,所以每个请求最终都在自己的线程中,它可以阻止它。

如果是这样的话,NIO的好处仍然存在,还是阻塞代码削弱了NIO的优点(就资源利用率而言)?

如果应用程序代码阻塞,nio连接器是否有益。。。?

,NIO连接器是在假设您的应用程序将在某个地方阻塞的情况下构建的。NIO连接器基本上有几个套接字占位符,并响应新的传入请求,直到信息开始被写回。

我没有找到NIO连接器使用的线程池的完整描述

我认为这是你困惑的开始。TomcatNIO有一个选择器池,而不是线程池(引用)。连接器代码轮询每个选择器,查看它是否有要发送的传入或传出字节。从这个意义上讲,给定请求的选择器将继续接收信息,直到有足够的信息来处理具有请求/响应对象的请求,该对象桥接了同步I/O和异步I/O(引用)之间的间隙。

轮询代码的阻塞时间永远不会超过序列化信息包所需的时间,因此可以自由处理新请求。唯一真正的限制是Tomcat可用的内存量。虽然存在线程池,但实际使用的线程数远低于应用程序可以处理(引用)的连接数。

虽然Tomcat连接器之间存在性能差异(参考),但当servlet本身阻塞时,原始请求/响应时间的差异非常小。然而,当您使用非阻塞I/O时,Tomcat可以处理的同时请求数量的差异会大不相同。

最新更新