java nio 与旧套接字编程模型一起使用序列化的优缺点
pros and cons of using serialization with java nio versus old socket programming model
我想在使用旧套接字编程模型(每个套接字一个线程)和使用 java.nio 的新套接字编程模型之间做出选择。当我阅读这篇关于非阻塞套接字架构的文章时,我注意到该架构是基于来自客户端的请求的序列化。
根据文章,客户端应用程序同时向服务器执行请求。选择器收集它们,创建密钥,并将它们发送到服务器。所以这篇文章让我感到困惑,因为序列化不能支持服务器的可扩展性。
如果您有 10000 个客户端连接到服务器,那么处理客户端的所有子请求应该会有一些延迟。另一方面,我读到将服务器扩展到 1000 个客户端的唯一方法是使用 java.nio。
这是文章:http://archive.oreilly.com/pub/a/onjava/2002/09/04/nio.html?page=2
So this article confused me, since serialization cannot support scalabity of servers. If you have 10000 of clients connected to a server, then there should some delay to process all the sub-requests of clients.
当有 I/O 需要处理时,NIO 线程将 运行 全速,以物理能力所能达到的速度处理数据。保持 NIO 线程高性能的关键是不要在线程上执行任何耗时或阻塞操作。您想尽快处理每条传入数据。
正确执行此操作意味着 NIO 线程将扩展到处理器的速度,这在当今是相当可观的。
是的,在某个时刻 NIO 线程将消耗 100% CPU 并且将无法再处理 I/O。不过,这一点比传统的阻塞 I/O 架构要高得多。更不用说您不会有 10,000 多个线程不断地进行上下文切换和消耗大量资源(堆栈 space、OS 任务条目等)。
如果您确实发现自己达到了一个 NIO 线程可以处理的极限——这种情况很少见——添加额外的 NIO 线程很容易。
我想在使用旧套接字编程模型(每个套接字一个线程)和使用 java.nio 的新套接字编程模型之间做出选择。当我阅读这篇关于非阻塞套接字架构的文章时,我注意到该架构是基于来自客户端的请求的序列化。
根据文章,客户端应用程序同时向服务器执行请求。选择器收集它们,创建密钥,并将它们发送到服务器。所以这篇文章让我感到困惑,因为序列化不能支持服务器的可扩展性。
如果您有 10000 个客户端连接到服务器,那么处理客户端的所有子请求应该会有一些延迟。另一方面,我读到将服务器扩展到 1000 个客户端的唯一方法是使用 java.nio。
这是文章:http://archive.oreilly.com/pub/a/onjava/2002/09/04/nio.html?page=2
So this article confused me, since serialization cannot support scalabity of servers. If you have 10000 of clients connected to a server, then there should some delay to process all the sub-requests of clients.
当有 I/O 需要处理时,NIO 线程将 运行 全速,以物理能力所能达到的速度处理数据。保持 NIO 线程高性能的关键是不要在线程上执行任何耗时或阻塞操作。您想尽快处理每条传入数据。
正确执行此操作意味着 NIO 线程将扩展到处理器的速度,这在当今是相当可观的。
是的,在某个时刻 NIO 线程将消耗 100% CPU 并且将无法再处理 I/O。不过,这一点比传统的阻塞 I/O 架构要高得多。更不用说您不会有 10,000 多个线程不断地进行上下文切换和消耗大量资源(堆栈 space、OS 任务条目等)。
如果您确实发现自己达到了一个 NIO 线程可以处理的极限——这种情况很少见——添加额外的 NIO 线程很容易。