为什么不选择使用原生的 NIO 而选择使用 Netty 呢?

Sherwin.Wei Lv7

为什么不选择使用原生的 NIO 而选择使用 Netty 呢?

回答重点

因为原生的 NIO 存在一些问题

1)原生 NIO 接口较多,能支持更精细化的调用,但是对于通常的使用而言过于复杂。就好下面这张图,对于已经深耕的专业人员来说,可能极好,但对于大部分人员使用来说太复杂了。

image.png

所以如果用原生 NIO 开发的话,需要进行二次封装,开发效率不高,且原生 NIO 对开发者要求较高,不好开发。

2)原生的 NIO 存在一些 Bug,最让人熟悉的就是 Selector 空轮询,可能会导致 CPU 100%

使用 Netty 的优势

1)Netty 封装了 NIO 的复杂 API,提供了更简单、直观的编程接口,使开发者更容易上手和维护。

2)Netty 提供了优化的多线程模型(如 Reactor 模型),可以更高效地处理 I/O 事件和任务调度,提升并发处理能力。

3)Netty 支持多种传输协议(http、dns、tcp、udp 等等),并且有自带编码器,解决了 TCP 粘包和拆包的问题。

4)在原生 NIO 的基础上解决了 Selector 空轮询 Bug 的问题,且准备内部的细节做了优化,例如 JDK 实现的 selectedKeys 是 Set 类型,Netty 使用了数组来替换这个类型,相比 Set 类型而言,数组的遍历更加高效,其次数组尾部添加的效率也高于 Set,毕竟 Set 还可能会有 Hash 冲突,这是 Netty 为追求底层极致优化所做的。

5)采用了零拷贝机制,避免不必要的拷贝,提升了性能。

Comments
On this page
为什么不选择使用原生的 NIO 而选择使用 Netty 呢?