【Java网络编程】:为什么Netty使用的是NIO而不是AIO

1. 前言

AIO是异步非阻塞的,NIO是同步非阻塞的。理论上讲,AIO的吞吐量肯定比NIO的要大。两种IO的概念如下:

  1. NIO模型: 同步非阻塞。服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  2. AIO模型: 异步非阻塞。服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。注:AIO又称为NIO2.0,在JDK7才开始支持。

2. 为什么Netty使用NIO而不是AIO?

主要原因如下:

  1. Netty不看重Windows上的使用,在Linux系统上,AIO的底层实现仍使用EPOLL,没有很好实现AIO,因此在性能上没有明显的优势,而且被JDK封装了一层不容易深度优化。
  2. Netty整体架构是reactor模型, 而AIO是proactor模型, 混合在一起会非常混乱,把AIO也改造成reactor模型看起来是把epoll绕个弯又绕回来。
  3. AIO还有个缺点是接收数据需要预先分配缓存, 而不是NIO那种需要接收时才需要分配缓存, 所以对连接数量非常大但流量小的情况, 内存浪费很多。
  4. Linux上AIO不够成熟,处理回调结果速度跟不上处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈(待验证)。

作者原话引用:

作者原话:
Not faster than NIO (epoll) on unix systems (which is true)
There is no daragram suppport
Unnecessary threading model (too much abstraction without usage)

你可能感兴趣的:(java,java网络编程,Java网络编程)