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
推荐阅读
- Apache多路复用模块(MPMs)介绍
- Spring集成|Spring集成 Mina
- mac|mac php5.6+mongdb+Apache环境配置
- 本文转载于THE|本文转载于THE ILLUMINATUS! TRILOGY
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
- Apache|Apache Zookeeper总结
- Apache|Apache BookKeeper中数据目录分析
- 阿里云配置|阿里云配置 apache 升级https 部署
- IDEA|IDEA 中使用MAVEN Install 项目的时候 报 org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed
- 如何在Android|如何在Android studio的Terminal中使用git命令(Windows环境)