J2SE|Apache Mina 初步接触之架构

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

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

[img]http://dl.iteye.com/upload/attachment/544413/a8b21a6f-6097-3682-afa6-d175a76cc2f6.jpg[/img]


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

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


[img]http://dl.iteye.com/upload/attachment/544415/d295bf4c-7a06-3829-9c63-ff6a598720db.jpg[/img]


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

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


[img]http://dl.iteye.com/upload/attachment/544417/967d13bd-ed77-3e66-bd05-06aa9c890a50.jpg[/img]

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

    推荐阅读