http://java.youkuaiyun.com/index.php/2009/09/23/专家专栏第二期:客户端nio实践分析/
传统IO操作和NIO操作的区别
1.对于数据处理由Stream方式转变称为了Block方式。
第一种转变不适合需要对于字节流做处理的场景。(需要对字节充分作处理,例如我在另一个优化中对于字节流采用lazy Analysis,通过边解析边交验的方式,提前过滤无效请求,降低由于分析大数据包无效请求带来的性能消耗)。
2.事件驱动机制替换了传统的一个线程处理到底的模式。
但是Block传输和处理这种转变符合操作系统的真实模式,使Java可以充分利用各个操作系统的实现来优化性能,同时管道的思想也符合操作系统的真实实 现(原来Java都是将双向通道拆分为In,Out的)。事件驱动使得完整的处理流程被拆分成为流水线作业,最大程度上利用了资源,防止后端处理成为了前 端请求的瓶颈,降低了服务器的吞吐量,同时最大限度的给开发者优化流程,缩短关键路径的机会。
下面表格大致列举了传统IO和NIO在客户端使用的需求和各自的优势(两者都需要的就不列入其中了,例如容错恢复等)
需求 | 优势 | |
IO(连接池) | 1. 连接池的管理。2. 高并发大压力下Socket数量庞大,对于文件句柄消耗也大 | 1. 数据发送接受处理简单,单线程模式。2.可以对字节流逐一解析,避免内存过分无谓消耗 |
NIO | 1. 交互的协议需要支持会话。(也可以不支持,这就会使得处理模式退化,效率下降,后续会谈到)2. 对于接收和发送需要支持多线程,提高效率3. 需要对Channel和Block有所熟悉 | 1. 资源利用率最大化,性能提升(消息通道的充分利用,操作系统IO优化的使用)2. 充分灵活的将处理分割为多个工作项,流水线作业,减小业务处理对服务器服务请求接收吞吐量的影响。 |