`
gearever
  • 浏览: 149313 次
社区版块
存档分类
最新评论

mina架构分析 (NIO 网络接口)

阅读更多
出处:http://gearever.iteye.com

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。
目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。
---百度百科
本文以mina 2.0.7为基础,记录mina nio网络接口的内部结构及消息流。在tomcat架构分析(connector NIO实现)中描述了tomcat的nio实现,两者可以做一个比较。应该说在一些思想上有共通的地方,在实现上可能mina的非阻塞更彻底一些。
	  public static void main(String[] args) {  
	        SocketAcceptor acceptor = new NioSocketAcceptor();  
	        acceptor.getFilterChain().addLast(  
	                "text",  new Business0Filter();  
	        acceptor.setHandler(new ServerHandler());  
	        try {  
	            acceptor.bind(new InetSocketAddress(PORT));  
	        } catch (IOException e) {  
	       	 acceptor.dispose();  
	        }  
	    }  

这是一个典型的基于mina的服务端程序。Mina的大体结构还是很清晰的,绑定一个端口接收消息,经过一个Filter链(上行)预处理request,最后在Handler完成业务逻辑,然后反向经过Filter链(下行)封装response,直至返回客户端。Mina支持TCP/UDP,本文只记录TCP(面向连接)的消息流。
看一下NioSocketAcceptor的内部结构概念图;

可以看出,整体上还是采用多Selector的架构。

Acceptor线程
在NioSocketAcceptor中有个Acceptor线程,它负责将一个ServerSocketChannel注册到主Selector中,注册事件为OP_ACCEPT,当有OP_ACCEPT响应时,取出相应的socket,封装在NioSocketSession中,并给这个NioSocketSession对象分配一个NioProcessor;

SimpleIoProcessorPool
NioSocketAcceptor维护的一个NioProcessor的对象池,这个对象池缺省状态下维护了Runtime.getRuntime().availableProcessors() + 1个NioProcessor对象,每个运行时建立的NioSocketSession对象都会分配一个NioProcessor对象,这个NioProcessor对象与NioSocketSession对象是一对多的关系;

NioProcessor
每个NioProcessor对象内部维护了一个Selector对象及Processor线程,除此还有一些数据结构,用于数据处理,主要的有;
  • Queue<S> newSessions = new ConcurrentLinkedQueue<S>()
  • Queue<S> flushingSessions = new ConcurrentLinkedQueue<S>()

其中,newSessions就是当给NioSocketSession对象分配NioProcessor时,将此NioSocketSession对象添加到此newSessions queue中,同时将对应的channel以OP_READ注册到这个NioProcessor对象的Selector,给session分配NioProcessor的逻辑是;
private IoProcessor<S> getProcessor(S session) {
        IoProcessor<S> processor = (IoProcessor<S>) session.getAttribute(PROCESSOR);
        if (processor == null) {
            if (disposed || disposing) {
                throw new IllegalStateException("A disposed processor cannot be accessed.");
            }
            processor = pool[Math.abs((int) session.getId()) % pool.length];
            if (processor == null) {
                throw new IllegalStateException("A disposed processor cannot be accessed.");
            }
            session.setAttributeIfAbsent(PROCESSOR, processor);
        }
        return processor;
}

这个session id是生成session时产生的。

NioProcessor对象的Processor线程就是从这个newSessions queue里取出新加进来的session对象,以OP_READ注册到自己Selector中,然后针对自己的Selector进行select()操作,当有可读的socket事件响应时就取出socket数据,然后走Filter链直至业务逻辑。当有了response需要返回给客户端时,会将response对象封装并添加到session对象的一个写出缓冲里,然后session对象被添加到NioProcessor对象的flushingSessions中,Processor线程会从flushingSessions中取出session,然后从session的写出缓冲中取出response,写socket。需要注意的是,在处理写的时候还是比较细腻的,进入flushingSessions queue有两种方式,
  • 一个是经过业务逻辑处理,产生response,直接将session压入flushingSessions queue;
  • 另一个是当执行上述写socket动作时,因为网络闪断或其他什么原因,写socket不能正常完成,这时,会将session对应的channel在Selector中注册OP_WRITE事件,当Processor线程发现这个session对应的channel有OP_WRITE事件时,会重新将这个session压入flushingSessions queue,然后就是走正常逻辑了,看下代码感受一下;

private boolean flushNow(S session, long currentTime) {
        final WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue();
        WriteRequest req = null;
        try {
            ......
            do {
                req = session.getCurrentWriteRequest();
                if (req == null) {
                    // session的写出缓冲中取response
                    req = writeRequestQueue.poll(session);
                    if (req == null) {
                        break;
                    }
                    session.setCurrentWriteRequest(req);
                }

                int localWrittenBytes = 0;
                Object message = req.getMessage();
                if (message instanceof IoBuffer) {
                    //写socket
                    localWrittenBytes = writeBuffer(session, req, hasFragmentation, maxWrittenBytes - writtenBytes, currentTime);

                    if ((localWrittenBytes > 0) && ((IoBuffer) message).hasRemaining()) {
                        //写socket成功,但是buffer中还有需要写的数据
                        writtenBytes += localWrittenBytes;
                        setInterestedInWrite(session, true);
                        return false;
                    }
                }
                
                ......
				//写socket出错,重置channel事件
                if (localWrittenBytes == 0) {
                    setInterestedInWrite(session, true);
                    return false;
                }
                ......
				
            } while (writtenBytes < maxWrittenBytes);
        } catch (Exception e) {
            ......
        }
        return true;
    }

    protected void setInterestedInWrite(NioSession session, boolean isInterested) throws Exception {
        SelectionKey key = session.getSelectionKey();
        if (key == null) {
            return;
        }
        int newInterestOps = key.interestOps();
		//注册OP_WRITE事件
        if (isInterested) {
            newInterestOps |= SelectionKey.OP_WRITE;
        } else {
            newInterestOps &= ~SelectionKey.OP_WRITE;
        }
        key.interestOps(newInterestOps);
    }

在各个Selector的维护及session的超时控制等方面,mina在实现的细节上还有很多特别的设计,不一一赘述了。和tomcat的nio框架比起来,感觉mina还是很细腻的,毕竟它是专门的nio框架。很多值得学习的地方。
分享到:
评论

相关推荐

    高性能网络架构Mina框架 下载

    ### 高性能网络架构Mina框架简介 #### 一、Mina框架概述 Mina(Multithreaded Internet Network Application)框架是由Apache软件基金会提供的一个高性能、可伸缩的网络编程框架,它主要应用于Java NIO环境下的...

    基于MINA构建简单高性能的NIO应用

    MINA架构的设计便于开发者快速实现复杂网络应用。核心是IoService,它作为抽象的IO操作的入口,能够处理服务器和客户端编程。IoService又分为两种,分别是IoAcceptor和IoConnector,前者用于服务器端接收连接,后者...

    MINA源码分析,内涵类的讲解

    总结来说,MINA源码分析涉及了网络编程的基础概念,包括异步事件驱动、过滤器链、编码解码、会话管理等多个方面。通过深入理解这些核心组件,开发者可以更加灵活地构建高并发、高性能的网络应用。同时,MINA的源码也...

    mina网络通信实例

    MINA采用了NIO(Non-blocking I/O)模式,它与传统的BIO(Blocking I/O)模式不同,BIO在等待数据读写时会阻塞线程,而NIO则允许线程在没有数据可读写时继续执行其他任务,极大地提高了系统资源的利用率和吞吐量。...

    Mina源码解析

    Mina支持多种网络协议,如HTTP、FTP、SMTP、SNMP等,这得益于其高度可扩展的架构。开发者可以方便地创建新的协议处理器,或者使用已有的协议处理器库。Mina的协议处理层提供了一套标准的API,使得协议的实现与底层...

    3本mina教程和mina帮助文档

    1. **Mina架构**:了解Mina的事件驱动模型和过滤器链,以及如何使用它们来处理网络通信。 2. **NIO原理**:学习非阻塞I/O的工作方式,以及Mina如何利用NIO提高性能和处理大量并发连接。 3. **Mina API**:熟悉Mina...

    MINA_API+MINA_DOC+mina

    这份自学手册可能会详细解释MINA如何使用非阻塞I/O(NIO)来提高性能,以及如何通过事件驱动模型实现高效的网络通信。它可能还会涉及如何配置和使用MINA的各种组件,如Buffer、Filters、Protocols等,帮助开发者更好...

    java-mina通信框架详解.docx

    在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当IoSession关闭时,如果不通过IoService的close方法,实际连接并不会断开。 IoProcessor接口则在另一个线程上处理...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    Apache MINA框架相关资料

    3. **Mina2源码分析**(Mina2源码分析.doc):源码分析文档通常由经验丰富的开发者编写,通过深入剖析MINA的源代码,揭示其内部工作原理,帮助开发者理解MINA如何实现非阻塞I/O,以及如何高效地处理网络连接和数据...

    mina2.0.3源代码

    Apache MINA是一个强大的开源网络应用框架,主要用于简化网络编程,特别是TCP/IP和UDP/IP协议的开发。MINA的核心是基于Java NIO(Non-blocking I/O)实现的,它提供了高度可扩展性和高效的性能,适用于处理大量并发...

    mina开发手册与mina完全自学手册.rar

    4. **Protocol Codec**:编码和解码是网络通信中的重要环节,Mina提供了ProtocolCodec接口,允许开发者自定义协议的编码和解码规则。 5. **服务端与客户端构建**:学习如何使用Mina API创建服务端和客户端,监听...

    mina 源码

    在分析"apache-mina-2.0.4"源码时,我们可以深入理解其设计理念、架构以及核心组件。 1. **MINA的设计理念** MINA的核心理念是异步非阻塞I/O,它利用Java NIO(New I/O)库来实现高效的网络通信。通过非阻塞I/O,...

    Mina2源码分析.docx

    IoProcessor 是真正代表会话的实际 I/O 操作的接口,它对现有的 Reactor 模式架构的 Java NIO 框架继续做了一层封装。它的泛型参数指明了它能处理的会话类型。接口中最重要的几个方法,add 用于将指定会话加入到此 ...

    MINA开发手册和JAR包

    MINA(Java IO Network Application Framework)是一个开源的网络应用程序框架,由Apache软件基金会维护,它为构建高性能、高可用性的网络应用提供了丰富的API和工具。MINA的目标是简化网络编程,无论你是在处理TCP/...

    apache-mina源码

    通过阅读和分析`apache-mina-2.0.16`的源码,我们可以深入理解MINA的设计思想,学习如何构建高效的网络服务,并能根据自己的需求定制和扩展MINA的功能。对于想要从事网络编程或系统架构设计的开发者来说,研究MINA...

    mina框架详解

    Mina 2.0相比之前的1.x版本,在架构和API设计上有了较大的改进,更好地支持了现代网络通信的需求。例如,2.0版本引入了更为灵活的过滤器机制,增强了对并发的支持,提高了性能。 ### 2.2 Mina 2.0执行流程详解 ###...

    mina-2.0.4 source code

    MINA利用Java的非阻塞I/O(Non-blocking I/O, NIO)模型,为开发面向服务的、高并发的网络应用提供了强大的工具。MINA 2.0.4是其稳定版本之一,包含了丰富的功能和优化,旨在提高开发效率和系统性能。 MINA的核心...

    MINA源码与例子

    4. **Event Handler**:事件处理器接口,当网络事件发生时,MINA会调用相应的事件处理器方法。例如,`messageReceived()`方法会在接收到网络数据时被调用。 5. **Transport**:传输层抽象,MINA支持多种传输方式,...

    mina即时聊天demo

    Mina(Java Multithreaded Application Network Architecture)是一个开源的网络通信框架,由Apache软件基金会开发并维护。它提供了一个高度可扩展的、高性能的、事件驱动的I/O服务架构,广泛应用于各种网络协议的...

Global site tag (gtag.js) - Google Analytics