使用http客户端库向服务发出同步请求时,将阻止线程,直到返回数据。那么在同步http请求中使用非阻塞io有什么好处吗?
用例:使用Spring MVC开发的Web应用程序。对于某些请求,将对REST服务进行同步调用。使用使用NIO来调用服务的HttpClient库是否有利? Jetty HttpClient使用非阻塞IO。我不清楚来自HttpComponents的HttpClient是否支持NIO。
答案 0 :(得分:3)
假设您实现了为多个客户端提供服务的某种服务。您需要通过I / O操作(文件访问,网络通信等)实现一定程度的并行性。否则,单个客户端可以阻止其他客户端。您现在有两个选择:
您可以生成多个线程,每个线程都使用阻塞I / O操作。
您使用单个线程(或非常少)并使用非阻塞I / O操作。
实现具有非阻塞I / O的解决方案通常要困难得多,因为您必须自己管理每个客户端的上下文。当您为每个客户端使用专用线程时,自然会给出上下文(线程上下文=客户端上下文)。
如果您拥有大量慢速客户端,非阻塞I / O值得额外的实施工作,因为您可以使用少量线程处理它们。如果你为每个客户使用了一个线程,他们主要是坐在那里等待,并且仍会使用大量的内存。
如果您没有实现服务而是简单的应用程序,那么非阻塞I / O肯定是不值得的。
更新:如果我正确理解了用例,您就拥有了一个Web应用程序,它不仅可以为Web客户端提供Web页面,还需要执行REST请求来为Web客户端提供服务。因此,如果您有大量并发客户端(数千或更多)并且REST请求需要很长时间(几秒钟),那么非阻塞I / O可能是有意义的。但是您的Web服务器需要支持异步操作,因此您可以将该线程返回给服务器,直到REST请求完成。 Servlert 3.0规范引入了异步操作。所以你需要一个像Tomcat 7这样的最新Web服务器。