【问题标题】:Java NIO in both server and client?服务器和客户端中的Java NIO?
【发布时间】:2011-11-24 12:08:43
【问题描述】:

我是 Java NIO 的新手。我有一点疑问。如果我使用 NIO 而不是 socket 客户端,服务器是否也应该使用 NIO 还是没有关系?

我担心应用程序的可扩展性。我正在查看每台服务器每秒大约 500-1000 个客户端请求。由于我会将数据发送到至少三个不同的服务器,因此理想情况下我每秒可以查看大约 1500 个客户端请求。为此,我已经有了一个相当不错的套接字池实现。

我拥有的是每个服务器的套接字连接池。每个线程从池中获取一个可用的套接字连接并将其发送到服务器

我正在尝试了解 NIO 是否可以提供帮助,或者在任何方面都比套接字客户端更好。 怎么堵?普通客户端会阻塞或超时。

【问题讨论】:

  • NIO 在服务器端不是比在客户端更有用吗?我不明白为什么它是客户端而不是服务器的要求?
  • @jgauffin 我只关心客户端。服务器是第三方应用程序,我通过 TCP 向其发送数据。我只打算最大化我的客户的性能。我正在考虑我的选择。那么使用 NIO 作为客户端与普通套接字客户端相比是一个好主意吗?
  • 恕我直言,您不会通过使用 NIO 从客户端获得更多性能。瓶颈将是服务器或网络。此外,NIO 更复杂,您很可能会出错而影响性能。保持简单并完成您的应用程序。

标签: java sockets nio socket.io


【解决方案1】:

没关系。 TCP 流将不受您选择的 NIO 的影响。

【讨论】:

  • +1:事实上,您的客户端或服务器可以是 C 或 PHP 或一些您从未听说过的平台。 Java 7 中的 NIO2 也是如此。
【解决方案2】:

恕我直言,您不会通过使用 NIO 从客户端获得更多性能。瓶颈将是服务器或网络。此外,NIO 更复杂,您很可能会出错而影响性能。

我会先做一个套接字实现来让它更快地启动和运行。如果您遵循一些常见的模式/原则,例如单一职责原则,那么以后很容易切换实现(如果您或您的用户已经证明您的应用程序性能是我认为极不可能的瓶颈)。

更新

NIO 或任何其他异步框架如何让多个操作共享相同的线程。在处理大量连接时,每个连接都有一个线程是一种资源浪费,因为所有线程不会一直处于活动状态。

如果您只有几个连接,则将 NIO 用于客户端不会给您带来任何好处。每个连接都有一个线程+套接字不会消耗太多资源,并且处理连接会更容易。

【讨论】:

  • 当你说Using NIO for a client will not give you any benefits if you have just a few connections. 那NIO在什么场景下会有用呢?在我的实现中,我会说,池中有 50 个套接字连接,每秒被 500 个线程使用/重用。所以我没有每个线程模型的连接。
  • 有 500 个线程?那些线程在做什么?你使用的是 linux/osx 还是 windows?
  • 我使用的是 Windows server 2008 64 位。简单来说,我的应用程序就像一座桥梁。它每秒收到 500 个 Web 服务请求。为每个 Web 服务请求创建一个线程,任务是通过 tcp 将请求传输到目的地。如果我必须将它发送到 3 个目的地,那么每个请求将创建 3 个线程。
  • 我不会在 Windows 机器中使用 500 个线程。线程上下文切换在 Windows 中不如在 linux 中便宜。使用 NIO 接收 Web 请求会效率更高。
  • @jgauffin 这是一个可疑的断言。 NIO 将调度移动到您的代码中,特别是到 select() 调用和随后的选定键集上的循环中。您的应用程序成为调度程序。使用 NIO,您的并发可能性为零;有了线程,您就可以免费获得它。
猜你喜欢
  • 2021-04-21
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2012-03-15
  • 1970-01-01
  • 2014-08-25
相关资源
最近更新 更多