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组件实现的细节及设计考量。

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

相关文章推荐

NIO框架------Netty

Netty: JOBSS提供的一个由java开发的高性能 异步事件驱动的NIO框架,该框架支持多路复用I/O,阻塞/非阻塞I/O以及同步I/O。 类似的还有MINA框架 重要的几个概念: 1.chan...

Java NIO框架(Java编程)

Java NIO框架MINA用netty性能和链接数、并发等压力测试参数好于mina1。NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O原力的I/O库与NIO最重要的区...
  • xia0615
  • xia0615
  • 2011年03月03日 15:28
  • 12708

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是...

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点...

说说nio----1

既然说到了nio,就得谈以下几个问题 为什么会出现新io,"旧io"有什么问题吗? ok,一步一步来,先给大家看几个例子: 1单线程的服务器程序 import java.net.*; import j...

Java NIO框架Netty简单使用

之前写了一篇文章:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码),介绍了如何使用Java原生IO支持进行网络编程,本文介绍一种更为简单的方式,即Java NIO框架。 N...
  • anxpp
  • anxpp
  • 2016年08月03日 22:37
  • 4950

NIO系列6:流行 NIO Framework netty 和 mina 性能测评与分析

测试方法 采用 mina 和 netty 各实现一个 基于 nio 的EchoServer,测试在不同大小网络报文下的性能表现 测试环境 ...

高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)

高吞吐高并发Java NIO服务的架构(NIO架构及应用之一) http://maoyidao.iteye.com/blog/1149015 Java NIO成功的应用在了各种...
  • xymyeah
  • xymyeah
  • 2012年06月28日 18:42
  • 11808

这个架构能实现吗?

近来一直在做一个产品的架构升级,架构升级的前期工作是对旧架构现存的问题进行梳理,考虑新架构的设计如何规避旧架构的坑,完善旧架构支持不佳的缺陷。终于完成了新架构设计,在给开发工程师讲解时,还会遇到开发的...

找一个好工作,谈一份好薪水

时不时有读者留言聊起关于选择工作和谈薪水的事情,比如:“毕业不久出来找工作,没面试几次就被忽悠,稀里糊涂的进去了一个公司,结果一进去才发觉,与自己想象的差别太大,说好给的薪水,一而再,再而三地砍价,没...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NIO系列1:框架拆解
举报原因:
原因补充:

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