4.1.1.5. 4种io概念
4.1.1.5.1. 异步非阻塞I/O
早期的JDK1.7之前,的NIO框架称为异步非阻塞io,严格按照UNIX网络编程模式和JDK的实现进行区分只能叫做,非阻塞IO.使用多路复用技术,而并发异步。
1.7提供NIO2.0.新增了异步套接字通道,基于线程维护,回调相关的方法。所以称为异步IO.也叫AIO.
4.1.1.5.2. 多路复用器 Selector
JDKNIO使用的是多路复用器,核心是通过Selector
来轮训注册在其上的channel
,当发现某个或则多个Channel
处于就绪状态后,从阻塞状态返回就绪的Channel的选择键集合,进行I/O
操作
4.1.1.5.3. 伪异步IO
官方没有这种说法。为了解决Tomcat通信线程同步I/O 阻塞,导致业务IO被挂住的问题。 在通信线程和业务线程之间做一个缓冲区,这个缓冲区用于隔离IO线程和业务线程间的直接访问。
4.1.1.5. 特性对比:
- | 同步阻塞I/O(BIO) | 伪异步I/O | 非阻塞I/O(NIO) | 异步I/O(AIO) |
---|---|---|---|---|
客户端个数:I/O线程 | 1 : 1 | M : N(其中M可大于N) | M : 1(1个I/O线程处理多个客户端链接) | M : 0(不需要启动额外的I/O线程,被动回调) |
I/O类型(阻塞) | 阻塞I/O | 阻塞I/O | 非阻塞I/O | 非阻塞I/O |
I/O类型(同步) | 同步I/O | 同步I/O | 同步I/O(I/O多路复用) | 异步I/O |
API使用难度 | 简单 | 简单 | 非常复杂 | 复杂 |
调试难度 | 简单 | 简单 | 复杂 | 复杂 |
可靠性 | 非常差 | 差 | 高 | 高 |
吞吐量 | 底 | 中 | 高 | 高 |
4.1.1.5. 不选择Java原生NIO编程的原因
- nio类型和api繁杂。
Selector
,ServcrSocketChannel
,SocketChannel
,ByteBuffer
等 - 需要熟悉Java多线程,网络编程等
- 重连、网络闪断、半包读写、失败缓存、网络拥塞、异常码流处理等问题,都需要自己解决
- JDK NIO bug。epoll bug。导致Selector空轮(CPU上升到100%)询等问题。
4.1.1.5. 为什么选择Netty
很多商用项目在使用,如Hadoop
的RPC
框架Avro
等。
4.1.1.5.1. 优点
- APi使用简单,开发门槛底
- 功能强大,预置多种编码功能,支持多种主流协议
- 定制能力强,可以通过
ChannelHandler
对通信框架进行灵活的扩展 - 性能高,通过与其他业界主流的NIO框架对比,Netty的综合性能最优
- 成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG
- 社区活跃,版本迭代周期短。
- 经历了大规模的商业应用考验。在互联网、大数据、网络游戏、企业应用、电信软件等众多行业已经得到成功商用。