日期:2014-05-16  浏览次数:20924 次

Apache Mina 初步接触之架构
最近在项目中使用了Apache Mina,看了网站的文档,对于使用来说是比较简单的。

由于之前对于NIO有所了解但是并不深刻,想借这个机会好好研究一下Mina的实现。Java NIO 使用了Reactor模式进行开发,所谓Reactor模式类似于Observer模式,都属于事件触发的。Java NIO的工作模型如下图所示:


<Refer [1]>

首先,需要创建一个Selector, 一般是通过Selector.open()来实现
然后,创建一个ServerSocketChannel,并绑定到本地端口
最后注册此channel到selector,并设置interest ops 为ACCEPT
等到客户端连接产生后,selector会得到相应 的SelectionKey,并根据event类型由相应的Handler处理

但是作为一个服务端程序,要考虑的因素有很多,这样简单的工作模型是远远不够的,常见的NIO 架构往往是这样的:



<Refer [1]>

最前端是一个Acceptor,专门处理客户端的新连接
被accept的socket channel,会注册到一个新的Selector,这个selector只对Read/Write的事件感兴趣,此时这些工作都在一个Dispatcher Pool中完成。 Pool中的Dispatcher则将事件处理Dispatch到Worker线程,由他们进行数据读写,最后调用应用相关的处理器响应请求。

在Mina中,相应的架构略有不同,它的Dispatcher跟Worker是1对1的关系,而且一个Dispatcher是处理多个Session的,同样它的Worker也是需要处理多个连接的。不知道这样会不会导致性能的下降?比如Worker顺序处理的多个任务中,第一个任务耗时比较长,那么后续的请求就会被阻塞。




Reference:
[1] http://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html