使用NIO连接器部署到Tomcat时,使用Servlet 3.0异步冗余



我看到了这个线程:java- servlet 3.0中的async vs nio在servlet 3.1中,但它似乎与servlet 3.1 nio有关(与tomcat nio nio http Connector相反)。

我理解是,使用Nio HTTP连接器实现Tomcat(Tomcat 8及更高版本的默认值),处理请求并产生响应的实际工作是在单独的工作线程上完成的,以及读取/读取//写数据仍然没有阻碍。

这似乎是与async servlet 3.0求解的问题,因为在请求/响应上完成的工作是在独立于HTTP连接线程的工作线程上完成的。

那么,它们是否解决了相同问题的两个解决方案?换句话说,如果Servlet容器已经异步,以异步的方式编写我的代码是否有任何好处?

可以通过了解从容器到应用程序代码的请求处理中的不同点发生的潜在位置来理解这一点。容器连接器(BIO/NIO)作业是接受套接字连接并将其交给线程,该线程在某个时间点调用Servlet Get/Post方法。现在,Tomcat Nio连接器基本上是容器决定使用Java Nio设施(Selector/Channel)来处理具有较少线程的多个IO通道。Selector提供了一种监视一个或多个NIO通道并识别何时可用于数据传输的机制,因此使用选择器容器可以使用一个线程而不是几个线程来管理多个通道。然后,这些现成的通道由线程提供,这些线程可能比生物连接器中所需的数量少。

顺便说一句 - 在此级别上进行了OS级优化,以改善NIO功能。例如,Java具有基于Linux Epoll事件通知设施的java.nio.channels.SelectorProvider实现。epoll功能可在Linux 2.6中使用,较新的内核。当在选择器注册成千上万的SelectabLechannels时,基于EPOLL的新型SelectorProvider实现比传统的基于民意调查的SelectorProvider实现更可扩展。当检测到2.6内核时,默认情况下将使用新的SelectorProvider实现。检测到2.6前内核时,将使用基于民意调查的SelectorProvider。

现在回到手头的问题。在Servlet 3.0之前,整个Servlet处理是同步的,在Servet 3.0中得到了改进,以便现在立即返回GET/POST方法,但没有写信给响应,除非通过呼叫AsyncContext complete的呼叫认为完成。到目前为止,一切都很好。但是还有另一个问题。servlet处理可能包括读取/写作对输入流/输出流的读取。这种IO的性质仍然是传统的。Servlet 3.0允许异步请求处理,但IO读取/写入仍然是旧样式的旧样式,例如,在以缓慢速度的客户端读取大量请求有效载荷,线程将阻止数据等待数据 - 所以Servlet 3.1非阻止IO io to recue to Rescue to recue现在,只要准备就绪,您就可以使用读取/写作逻辑的回调样式调用,而不是等待它的线程。在这里可以看到它的工作方式。

我们仍然必须记住数据库IO(如果有)仍然是传统的等待IO。该区域由遵守JDBC API的数据库驱动程序控制,并且有一天知道他们也为非阻滞IO提供API。Oracle已经领导着这样的计划异步数据库访问,该计划似乎也在利用Java Nio。这将铺平整个请求处理非阻滞的方法。

还源于春季的另一个有希望的工作 - 反应性关系数据库连接,旨在解决此问题。

最新更新