-1

我想在使用旧套接字编程模型(每个套接字一个线程)和使用 java.nio 的新套接字编程模型之间进行选择。当我阅读这篇关于非阻塞套接字架构的文章时,我注意到该架构是基于来自客户端的请求的序列化。

根据文章,客户端应用程序同时向服务器执行请求。选择器收集它们,创建密钥,并将它们发送到服务器。所以这篇文章让我很困惑,因为序列化不能支持服务器的可扩展性。

如果您有 10000 个客户端连接到服务器,那么处理客户端的所有子请求应该会有一些延迟。另一方面,我读到将服务器扩展到 1000 个客户端的唯一方法是使用 java.nio。

这是文章: http: //archive.oreilly.com/pub/a/onjava/2002/09/04/nio.html?page =2

4

1 回答 1

1

所以这篇文章让我很困惑,因为序列化不能支持服务器的可扩展性。如果您有 10000 个客户端连接到服务器,那么处理客户端的所有子请求应该会有一些延迟。

当有要处理的 I/O 时,NIO 线程将全速运行,以物理能力的速度处理数据。保持 NIO 线程高性能的关键是不在线程上执行任何耗时或阻塞的操作。您希望尽可能快地处理每条传入数据。

正确地执行此操作意味着 NIO 线程将扩展到您的处理器的速度,这在当今是相当可观的。

是的,在某个时刻,NIO 线程将消耗 100% 的 CPU,并且无法处理更多的 I/O。不过,这一点比传统的阻塞 I/O 架构要高得多。更不用说您不会有 10,000 多个线程不断地进行上下文切换并占用大量资源(堆栈空间、操作系统任务条目等)。

如果你真的发现自己达到了一个 NIO 线程可以处理的极限——这是很少见的——那么添加额外的 NIO 线程就很容易了。

于 2015-08-19T14:19:33.173 回答