`
daimojingdeyu
  • 浏览: 272070 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

Mina原理草图及注释

    博客分类:
  • Java
阅读更多

今天先画一个草图备忘,明天再注释一下。

 

 

上图是Mina的Server端内部运行图,Client处表示外部的客户端通过Socket建立连接。

图中IoAcceptor对应NioSocketAcceptor类,是用来接受Socket请求的。

 

图中用灰色的齿轮表示,小齿轮表示他一直可以干活,运转不息。黄色的小齿轮则表示一个运行在线程池上的任务,表示它是运转在线程池之上的。

 

1、服务端在创建NioSocketAcceptor实现时,会生成一个线程池,此线程池用来执行一个接受请求的任务,这个任务叫Acceptor(可以在AbstractPollingIoAcceptor类中找到其实现类),Acceptor会开一个Selector,用来监听NIO中的ACCEPT事件。任务初始化时并没有执行,而在调用NioSocketAcceptor实例的bind方法时,则会启动对指定端口的ACCEPT事件的监听。

 

2、SimpleIoProcessorPool是在NioSocketAcceptor实例化时创建的,其上有N+1(N=CPU的个数)个NIOProcessor来处理实际IO的读写事件,每个NIOProcessor都会对应一个Selector,来监听Socket中的读写事件。实际对读写的操作也是在一个SimpleIoProcessorPool实例化好的一个线程池中以任务的形式执行,这个任务叫Processor(可以在AbstractPollingIoProcessor类中找到其实现)。

 

1、2中都有提到Selector,这也就是Mina中处理IO事件引入的双Selector的模型,是对Reactor模式的扩展。

下图展示了Mina中reactor模型:

 

而传统的reactor模型则如下:

 

 

一次请求的过程如下:

Client通过Socket连接服务器,先是由Acceptor接收到请求连接的事件(即ACCEPT事件)。此事件由Acceptor进行处理,会创建一条Socket连接,并将此连接和一个NIOProcessor关联,这个过程通过图中的 连接分配器 进行,连接分配器会均衡的将Socket和不同的NIOProcessor绑定(轮流分配),绑定完成后,会在NIOProcessor上进行读写事件的监听,而读写的实际处理则分配给Processor任务完成。当有读写事件发生时,就会通知到对应的Processor进行数据处理。

 

先写这么多吧,可以结合Mina的代码来看一下上面的流程。个人理解,希望对想对Mina了解的兄弟有点帮助。

  • 大小: 41.4 KB
分享到:
评论
2 楼 yzhw 2012-06-27  
请问同一个session的数据在worker threads 中经过的decode compule encode的过程中,怎么确保处理消息的顺序按着接收到顺序一致,而不会被线程的执行时机扰乱;第二个问题是文中说“每个NIOProcessor都会对应一个Selector”, Selector的个数不是在启动时注册的一个吗?
1 楼 yzhw 2012-06-27  
两个图貌似一样

相关推荐

Global site tag (gtag.js) - Google Analytics