2.5.2 不同I/O模型对比
不同的I/O模型由于线程模型、API等差别很大,所以用法的差异也非常大。由于之前的几个小节已经集中对这几种I/O的API和用法进行了说明,本小节会重点对这几种I/O进行功能对比。如表2-1所示。
表2-1 几种I/O模型的功能和特性对比
|
|
同步阻塞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使用难度 |
简单 |
简单 |
非常复杂 |
复杂 |
|
调试难度 |
简单 |
简单 |
复杂 |
复杂 |
|
可靠性 |
非常差 |
差 |
高 |
高 |
|
吞吐量 |
低 |
中 |
高 |
高 |
尽管本书是专门介绍NIO框架Netty的,但是,并不意味着所有的Java网络编程都必须要选择NIO和Netty,具体选择什么样的I/O模型或者NIO框架,完全基于业务的实际应用场景和性能诉求,如果客户端并发连接数不多,周边对接的网元不多,服务器的负载也不重,那就完全没必要选择NIO做服务端;如果是相反情况,那就要考虑选择合适的NIO框架进行开发。
对比完Java的几种主流I/O模型之后,我们继续看下为什么要选择Netty进行NIO开发,而不是直接使用JDK的NIO原生类库。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:342347198
