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

2022-09-03 07:35:46

在阅读了Tomcat NIO连接器之后,我仍然没有得到一件事:如果应用程序代码被阻止,即它阻止从数据库读取,读取文件系统,调用外部Web服务,nio连接器是否有好处?

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

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

如果是这样的话,NIO的好处仍然存在,还是阻止代码减少了NIO的好处(就资源利用率而言)?


答案 1

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

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

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

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

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

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


答案 2

推荐