NIO系列1:框架拆解

原创 2012年04月01日 08:09:30

最近一年用NIO写了不少网络程序,也研究了一些开源NIO网络框架netty、mina等,总结了一下NIO的架构特点。

无论是netty还是mina它们都在java原生NIO的基础上进行了完善的封装,虽然细节有所不同,但总体架构思路一致,都大概划分出了以下几个组成部分:

- - transport:传输层的抽象

- - protocol: 协议codec的抽象

- - event model:统一事件模型

- - buffer:底层buffer封装

在完全屏蔽底层API的同时,对上层应用提供了自身的统一API接口。

框架进行黑盒封装的同时,再进行通用化的接口开放,带来的好处是统一化,但坏处是程序的透明度降低,抽象度提高,增加理解难度和实现难度。


下面说说每个部分的一些设计考量:

transport传输层抽象都是对java原生NIO API的封装,在这一层封装的程度在于框架的实现目标。例如mina立足于通用的网络框架,因此完全屏蔽了原生的API,提供了自身的统一接口,因为它不仅需要封装NIO的API还有一系列其他类型的IO操作的API,提供统一API接口。为了通用兼顾各类传输通道因此可能不得不暴露多余的API接口,使用方需甄别传输通道的不同,增加了理解难度。

protocol封装各类常用协议的codec操作,但目前这些网络框架的codec实现都与自身的API紧密绑定,降低了可重用性。

event model 事件模型的设计通常不能完全独立,例如java NIO本身的模型是事件驱动的,但传统阻塞型IO并非事件驱动,要兼顾二者通常要付出额外的代价和开销。

有一种说法是让异步IO同步化使用(因为同步化使用更简单,异步导致了业务处理的碎片化)到底对不对值得商榷?模型阻抗导致的代价和开销屏蔽在了黑盒中,也容易误导应用程序员对本该采用同步化处理的业务却滥用了异步化机制,并不会带来什么好处。

buffer 通常都用来配合底层IO数据流和协议codec使用,本身是否适合暴露给应用方取决于框架是否整合codec,因为codec本身带有业务性质,而纯粹的IO数据流处理使用的buffer则完全无需暴露给应用方。


以上简单说了下NIO框架各部分的设计考量,可以看出目前流行的NIO框架(netty和mina)都在走一条类似“瑞士军刀”的路线,集各种功能与一身(多种IO封装、协议封装),但你又很难把瑞士军刀上的某个刀片拆下来单独使用。

在实践中感觉,考虑从单一性、简洁性、重用性、组合性、透明性几个方面去设计原子化的IO组件也许更可取,更像是一种“工具箱”路线。


典型的事件驱动模型NIO框架组件交互图如下:


Acceptor:  负责监听连接事件负责接入

Processor:负责IO读写事件处理

EventDispatcher:负责事件派发

Handler:业务处理器

后面将通过一个系列文章来讨论一个原子化的NIO组件实现的细节及设计考量。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

java-----NIO总结(一)

最近项目中用到了AndroidPN框架来实现一个推送平台,在看AndroidPN源码的过程中,着实有些费力,因为他内部是用MINA框架实现的,想想还是先把MINA搞清楚了再来看AndroidPN框架了...

java-----NIO总结(二)

上一篇文章中,我们分析了通常我们使用的面向字节流的BIO所存在的阻塞问题,那么这篇博客我们来看看java为我们提供的解决BIO的方案,就是NIO了;         在上篇文章的最后,我们提到了,使用...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

MINA框架源码分析(四)

总结篇: MINA的整个执行过程是: (1):在我们创建完Nio

Java NIO笔记(一):NIO介绍

Java NIO即Java Non-blocking IO(Java非阻塞I/O),因为是在Jdk1.4之后增加的一套新的操作I/O工具包,所以一般会被叫做Java New IO。NIO是为提供I/O...

MINA框架源码分析(一)

作为一个比较优秀的网络通信框架,MINA框架大大的方便了我们开发高性能、高扩展性应用程序的效率,他的底层实现是java NIO,众所周知NIO是同步非阻塞式IO,使用它我们可以开发高并发的java程序...

Java NIO笔记(二):NIO Buffer(缓冲区)之基础

在Java NIO中,Channel

java-----NIO总结(三)

前两篇博客我们通过将accept和read设置成非阻塞式的方式实现了同步非阻塞模式,但是缺点在于在服务端需要为每个客户端都要创建一个线程来处理每个客户端的请求,这点相对来说比较耗费服务端资源,比如我们...

MINA框架源码分析(二)

上一篇我们通过实例学习了MINA框架的用法,发现用起来还是挺方便的,就那么几步就可以了,本着学东西必知其原理的观念,决定看看MINA的源码实现,好了,我们开始吧!         MINA源码对于客户...

java-----NIO总结(四)

我们知道java中的IO经历了BIO到NIO再到AIO的发展,具体来讲的话BIO是同步阻塞式IO,NIO是同步非阻塞式IO,而AIO是异步非阻塞式IO,前面我们分析了BIO和NIO的用法,至于AIO目...

Java NIO框架Mina、Netty、Grizzly介绍与对比

Java NIO框架Mina、Netty、Grizzly介绍与对比原文链接:http://www.24xuexi.com/w/2011-11-14/98277.html原文日期:2011年11月14日...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)