乐趣区

关于java:为什么不建议使用-Java-原生-NIO

作者:rickiyang

出处:www.cnblogs.com/rickiyang/p/11074238.html

开发出高质量的 NIO 程序并不是一件简略的事件。

除去 NIO 固有的复杂性和 Bug 不谈,作为一个 NIO 服务端, 须要可能解决网络的闪断、客户端的反复接入、客户端的平安认证、音讯的编解码、半包读写等状况,如果你没有足够的 NIO 编程教训积攒,一个 NIO 框架的稳固往往须要半年甚至更长的工夫。

更为蹩脚的是,一旦在生产环境中产生问题,往往会导致跨节点的服务调用中断,重大的可能会导致整个集群环境都不可用,须要重启服务器,这种非正常停机会带来微小的损失。

从可维护性角度看,因为 NIO 采纳了异步非阻塞编程模型,而且是一个 I/O 线程解决多条链路,它的调试和跟踪十分麻烦,特地是生产环境中的问题,咱们无奈进行无效的调试和跟踪,往往只能靠一些日志来帮忙剖析,定位难度很大。

对于 Java 原生的 IO 咱们之所以不抉择应用是因为:

  1. NIO 的类库和 API 繁冗应用麻烦,你须要熟练掌握 Selectol,ServerSocketChannel,
    SocketChannel,ByteBuffer 等。
  2. 需妥具备其余的额定技能做制垫,例如相熟 Java 多线程编程。这是因为 NIO 编程波及到 Reactor 模式,你必须对多钱程和网络编程十分如悉,能力编写出高质量的 NIO 程序。
  3. 可靠性能力补齐,工作量和难度都十分大。例如客户端面临断连重连、网络间断、半包读写、失败缓存、网络拥塞和异样码流的解决等问题,NI0 编程的特点是性能开发绝对容易,然而可靠性能力补齐的工作量和难度都十分大。
  4. JDK NIO 的 BUG,比方 epoll bug,这个 BUG 会在 linux 上导致 cpu 100%,使得 nio server/client 不可用,这个 BUG 直到 jdk 6u4 才解决,然而直到 JDK1.7 中依然有这个问题,该问题并未被齐全解决,只是产生的频率升高了而已。

基于上述起因大多数场景下都不倡议间接使原生 NIO,除非你精通 NIO 编程或者是有非凡的须要,否则作为服务器编程的 NIO 可能会带来微小的生产隐患。

对于 Netty:

Netty 是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的反对,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-Listener 机制,用户能够不便的被动获取或者通过告诉机制取得 IO 操作后果。

作为以后最风行的 NIO 框架,Netty 在互联网畛域、大数据分布式计算畛域、游戏行业、通信行业等取得了宽泛的利用,一些业界驰名的开源组件也基于 Netty 的 NIO 框架构建。

与 Netty 同样性能的 NIO 框架还有 Mina,Netty 的主导作者与 Mina 的主导作者是同一人,在设计理念上与 Mina 基本上是统一的。Mina 出身于开源界的大牛 Apache 组织,Netty 出身于商业开源大亨 Jboss。

这几年 Netty 社区绝对比拟沉闷,所以咱们就先抉择 Netty 作为动手网络编程的首选,有工夫再学习一下 Mina。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版