专栏首页Java技术栈为什么不建议使用 Java 原生 IO?

为什么不建议使用 Java 原生 IO?

开发出高质量的 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。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。

参考:《Netty权威指南 》

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

本文分享自微信公众号 - Java技术栈(javastack),作者:点击关注 ????

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么我不建议你使用Java序列化

    如今大部分的后端服务都是基于微服务架构实现的,服务按照业务划分被拆分,实现了服务的解耦,同时也带来了一些新的问题,比如不同业务之间的通信需要通过接口实现调用。两...

    故里
  • 我为什么不建议你使用Python3.7.3?

    之前使用Python的环境一直是Python3.7.3的,一直使用的很正常,没有什么毛病,直到最近做一个图片下载器的时候发现了问题。

    云爬虫技术研究笔记
  • 为什么不建议使用goto语句

    现在老师上课基本上不怎么讲goto语句,很多文章也提到不建议使用,那到底是为什么呢?

    用户6755376
  • 为什么不建议使用 Java 自带的序列化?

    作者:rickiyang 出处:www.cnblogs.com/rickiyang/p/11074232.html

    Java技术栈
  • 为什么建议使用 LocalDateTime ,而不是 Date?

    使用 SimpleDateFormat对时间进行格式化,但 SimpleDateFormat是线程不安全的 SimpleDateFormat的 format方法...

    zhisheng
  • 什么是Linux?为什么建议使用Linux?

    Linux并不是指某一个系统而是指它的“发行版”他与Windows以及Mac OS一样是一个习惯性系统,所谓Linux系统仅仅只是所有发行版的统称“Linux系...

    啾咪的阿网
  • 为什么不建议在MySQL中使用UTF-8?

    最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:

    Bug开发工程师
  • 为什么建议你使用LocalDateTime而不是Date?

    calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的Simple...

    Bug开发工程师
  • 为什么建议使用你 LocalDateTime ,而不是 Date?

    来源:juejin.im/post/5d7787625188252388753eae

    JAVA葵花宝典
  • 为什么不建议在MySQL中使用UTF-8?

    作者:brightwang 原文:https://www.jianshu.com/p/ab9aa8d4df7d

    好好学java
  • 为什么建议使用你LocalDateTime,而不是Date?

    在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗?

    良月柒
  • 为什么建议使用你 LocalDateTime ,而不是 Date?

    多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat对象 => 创...

    芋道源码
  • 为什么建议使用你 LocalDateTime ,而不是 Date?

    来源:juejin.im/post/5d7787625188252388753eae

    用户1516716
  • 为什么我不建议你用 Select * ?

    应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。

    一个优秀的废人
  • 为什么日期不建议使用VARCHAR2或者NUMBER?

    通常在数据库表设计时,不建议将日期类型的字段定义为VARCHAR2或者NUMBER类型,语义是其中一方面的原因,从使用层面,还是有其他原因。

    bisal
  • 为什么建议你使用枚举?

    枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用...

    Java中文社群-磊哥
  • 为什么MySQL不建议使用NULL作为列默认值?

    blog.csdn.net/qq_30549099/article/details/107395521

    肉眼品世界
  • APT 为什么不使用 HTTPS 协议?

    (这篇文章代表了一段时间前,特别是在CVE-2019-3462之前的情形。它并不代表我的个人意见,也不代表Debian / Ubuntu。)

    Seebug漏洞平台
  • APT 为什么不使用 HTTPS 协议?

    (这篇文章代表了一段时间前,特别是在CVE-2019-3462之前的情形。它并不代表我的个人意见,也不代表Debian / Ubuntu。)

    Seebug漏洞平台

扫码关注云+社区

领取腾讯云代金券