Netty为什么放弃使用AIO

前言

为什么Netty使用NIO,而不使用AIO

NIO和AIO的区别

NIO模型(同步非阻塞)

NIO有同步阻塞和同步非阻塞两种模式,一般讲的是同步非阻塞,服务器实现模式为一个请求一个线程,但客户端发送的连接请求都会注册到一个多路复用器上,多路利用器轮询到连接有I/O请求时才启动一个线程进行处理。

AIO模型 (异步非阻塞)

服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

然后看下Netty作者在这个问题上的原话
Not faster than NIO(epoll) on unix systems (which is true) 译:在UNIX系统上不比NIO快
There is no daragream support 译:不支持数据报
Unnecessary threading model(too much abstraction without usage) 译:不必要的线程模型

所以我们可以总结出以下几点:

  • 在LINUX系统上,AIO底层实现仍使用Epoll,没有很好的实现AIO,因此性能上没有明显优势,而且被JDK封装了一层不容易优化
  • Netty整体架构是基本reactor模型,而aio是proactor模型,混合在一起会比较混乱
  • aio还有个缺点是接收数据需要预先分配缓冲区,而不是NIO那种需要接收时才需要分配缓存,所以对连接数量非常大但流量小的情况,内存浪费很多
  • linux上aio不够成熟,处理回调的结果速度跟不到处理需求,供不应求,造成处理速度有瓶颈
posted @ 2021-03-27 15:24  米九虫  阅读(1046)  评论(1编辑  收藏  举报