2011-11-24 65 views
2

我是Java新手NIO.I有一点疑问。如果我使用NIO而不是套接字客户端,服务器是否也使用NIO或者它没有关系?服务器和客户端都支持Java NIO吗?

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

我所拥有的是插座的连接池,每个线程server.Each拿起从池中的可用套接字连接,并将其发送给服务器

我试图找出是否NIO可以帮助或者是比套接字客户端更好。 如何阻止?普通客户端会阻塞或超时。

+1

NIO不是在服务器上比在客户端更有利吗?我不明白为什么它是客户端而不是服务器中的要求? – jgauffin

+1

@jgauffin我只关心客户端。服务器是我通过TCP发送数据的第三方应用程序。我只打算最大限度地提高我的客户的表现。我正在考虑我的选择。那么使用NIO作为客户端还是普通套接字客户端是一个好主意? – Dunxton

+2

imho您将无法通过使用NIO从客户端获得更多性能。瓶颈将是服务器或网络。此外,NIO更复杂,并且很可能会出现会损害性能的错误。保持简单并完成您的应用程序。 – jgauffin

回答

4

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

+0

+1:事实上,您的客户端或服务器可以是C或PHP或您从未听说过的某个平台。这同样适用于Java 7中的NIO2。 –

2

恕我直言,你不会通过使用NIO获得更多的性能。瓶颈将是服务器或网络。此外,NIO更复杂,并且很可能会出现会损害性能的错误。

我会先做一个套接字实现来让它更快地运行起来。如果您遵循一些常见模式/原则(如单一责任原则),稍后可以轻松切换实施(如果您或您的用户已证明您的应用程序性能是我认为极不可能的瓶颈)。

更新

什么NIO或任何其他异步框架它让多业务共享同一线程。每个连接在处理大量连接时都有一个线程会浪费资源,因为所有线程都不会始终处于活动状态。

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

+0

当您说'如果您只有几个连接,则将NIO用于客户端不会给您带来任何好处。 '那么NIO会在什么情况下有用?在我的实现中,我会说,在一个池中有50个套接字连接,每秒使用/重用500个线程。所以我没有每个线程模型的连接。 – Dunxton

+0

有500个线程?那些线程在做什么?你使用的是linux/osx还是windows? – jgauffin

+0

我使用Windows Server 2008 64位。简单来说,我的应用就像一座桥梁。它每秒获得500个Web服务请求。为每个Web服务请求创建一个线程,其任务是通过tcp将请求传输到目标。如果我必须将它发送到3个目标,则每个请求将创建3个线程。 – Dunxton