如何选择java nio vs io?

jia*_*afu 20 java nio

正如我们所知,如果我们想使用传统的IO构建服务器,它必须阻塞某个地方,所以我们不得不使用循环或一个线程一个套接字模式,所以nio似乎是更好的选择.所以我想知道nio永远是更好的选择吗?

Pet*_*rey 19

恕我直言,阻止IO通常是最简单的使用,除非你有一个特定的要求,要求你的系统更多,你应该坚持最简单的选择.

下一个最简单的选择是阻止NIO,如果我想要比IO更高效或更有效的控制,我通常更喜欢NIO.它仍然相对简单,但允许您使用ByteBuffers.例如,ByteBuffers支持小端.

常见的选择是使用非阻塞NIO和选择器.这引入的大部分复杂性可以通过Netty或Mina等框架来处理.如果您需要非阻塞IO,我建议您使用这样的库,例如,因为每台服务器有数千个并发连接.恕我直言你有成千上万的连接,你应该考虑拥有更多的服务器,除非每个连接做的事情是非常微不足道的.AFAIK谷歌为每台服务器提供更多服务器而非数千名用户.

更极端的选择是使用NIO2.这比非阻塞NIO写得更复杂,更冗长.我不知道任何支持这个的框架.即你做的时候实际上更快.AFAIK如果你有Infiniband(这是它的设计支持),这似乎值得使用,但如果你有以太网可能不值得使用.

  • @MarounMaroun 这取决于消息的大小,但我建议使用一些缓冲,无论您做出什么其他选择,您都应该能够每秒处理数十万条消息。注意:如果可以,尽量使消息更小。 (2认同)
  • @PeterLawrey 小更新,也许会帮助其他访问者.. 部分问题是机器本身(我的应用程序部署在 AWS t2.small 机器上,该机器没有提供良好的网络性能,在我将应用程序移至更高级的机器后,错误数量显着减少。 (2认同)

Mar*_*nik 12

如果你想要非阻塞IO,NIO不是更好的选择 - 它是Java 的唯一选择.请记住,人们仍然经常使用旧的IO,因为它更容易编码.NIO API非常原始,与客户端API相比,它更像是一种低级技术.我建议通过API使用NIO,它为使用非阻塞IO解决的问题提供更简单的接口.