java - 在同步http请求中使用非阻塞io的优点

标签 java nio apache-httpclient-4.x

当使用 http 客户端库向服务发出同步请求时,线程将被阻塞,直到返回数据。那么在同步http请求中使用非阻塞io有什么优势呢?

用例:使用 Spring MVC 开发的 Web 应用程序。对于某些请求,会同步调用 REST 服务。使用使用 NIO 调用服务的 HttpClient 库是否有利? Jetty HttpClient使用非阻塞IO。我不清楚 HttpClient 是否有效HttpComponents 支持 NIO。

最佳答案

假设您实现了某种为多个客户端提供服务的服务。您需要实现 I/O 操作(文件访问、网络通信等)一定程度的并行性。否则,单个客户端可能会阻止其他客户端。您现在有两个选择:

  1. 您可以生成多个线程,每个线程都使用阻塞 I/O 操作。

  2. 您使用单个线程(或很少)并使用非阻塞 I/O 操作。

使用非阻塞 I/O 实现解决方案通常要困难得多,因为您必须自己管理每个客户端的上下文。当您为每个客户端使用专用线程时,自然会给出上下文(线程上下文 = 客户端上下文)。

如果您有大量缓慢的客户端,那么非阻塞 I/O 值得付出额外的实现努力,因为您可以使用少量线程来处理它们。如果您为每个客户端使用一个线程,那么它们主要会坐在那里等待,并且仍然会使用大量内存。

如果您实现的不是服务而是简单的应用程序,那么非阻塞 I/O 肯定不值得。

更新:如果我正确理解了用例,您有一个 Web 应用程序,它不仅向 Web 客户端提供网页,还需要执行 REST 请求来为 Web 客户端提供服务。因此,如果您有大量并发客户端(几千个或更多)并且 REST 请求需要很长时间(几秒),那么非阻塞 I/O 就有意义。但是您的 Web 服务器需要支持异步操作,以便您可以将线程返回给服务器,直到 REST 请求完成。 Servlert 3.0 规范引入了异步操作。因此,您需要一个最新的 Web 服务器,例如 Tomcat 7。

关于java - 在同步http请求中使用非阻塞io的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485742/

相关文章:

java - 我无法选择何时使用 MouseListener 对象

java - 加入 nio.path 与 Paths.get() 或 Path.resolve()

java - java NIO中取消注册并重新注册

java - 如何通过java nio writer覆盖文件?

java - 使用 org.apache.http 时,http 获取 json 文件中出现意外字符

java - 将一个变量用作数据类型不同但名称相同的另一个变量

java - 是否存在更好的方式来记录更新历史记录?

java - HttpClient 4.3.x,修复不推荐使用的代码以使用当前的 HttpClient 实现

java - 创建 HTTP 连接并保持打开状态以接收数据

java - elasticsearch NodeBuilder vs TranportClient