netty

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序

NIO模型

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

AIO模型

异步非阻塞
服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
注:AIO又称为NIO2.0,在JDK7才开始支持。

为什么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不够成熟,处理回调结果速度跟不到处理需求,比如外卖员太少,顾客太多,供不应求,造成处理速度有瓶颈

NIO是同步的,netty为什么是异步的

netty是通过事件驱动实现异步的,所以netty才可以提供异步非阻塞服务,它提供了对TCP、UDP和文件传输的支持。
所有的IO操作都是异步的,用户可以通过Future-Listeren机制主动get结果或者等IO线程完成操作之后主动Notify来通知,用户业务线程不需要同步等待。用户能够方便的主动获取或者通过通知机制获得IO操作结果。

io.netty.channel.Channel类的一段注释请参考。

1
2
3
4
5
6
All I/O operations are asynchronous.
All I/O operations in Netty are asynchronous. It means any I/O calls will
return immediately with no guarantee that the requested I/O operation has
been completed at the end of the call. Instead, you will be returned with
a {@link ChannelFuture} instance which will notify you when the requested I/O
operation has succeeded, failed, or canceled.

Netty说自己是异步事件驱动的框架,并没有说网络模型用的是异步模型,异步事件驱动框架体现在所有的I/O操作是异步的,所有的IO调用会立即返回,并不保证调用成功与否,但是调用会返回ChannelFuture,netty会通过ChannelFuture通知你调用是成功了还是失败了亦或是取消了。

Netty的宣传:Netty is an asynchronous event-driven network application framework
for rapid development of maintainable high performance protocol servers & clients

参考:
https://www.jianshu.com/p/df1d6d8c3f9d
https://www.cnblogs.com/UncleCatMySelf/p/9187220.html
https://segmentfault.com/q/1010000016221286