基于NIO的高并发网络服务器模型的研究与设计

减小字体 增大字体 作者:王伟平 杨思勤  来源:www.zhonghualunwen.com  发布时间:2009-12-26 15:27:39

  一、引言
  
  J2EE是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。在保留现存的IT资产,快速开发以及支持异构环境等因素的考虑下,众多大型企业的企业级应用均采用J2EE技术。在大型的企业架构中,基于客户/服务器模式所设计的服务器程序由于能为客户提供一些特定的服务而得到了普遍的应用,这种服务器程序的核心技术是并发技术,服务器需要同时对多个客户请求提供服务[1],为每个连接的客户都分配一个线程来处理输入输出,其线程与客户机之比几乎为1:1,因此,应用服务器易受到大量线程开销的影响,导致了性能低下又缺乏可伸缩性。为了解决这个问题,java平台的开发者引入了非阻塞I/O机制(NIO)[2]。NIO与IO包提供的阻塞模型不同,NIO在对一个非阻塞的连接进行操作时,调用会立即返回,而不是挂起等待,这就使得一个线程管理多个连接成为可能,从而使资源使用率得到很大的提升[3]。
  在满足高性能需求同时,企业还要求服务器端平台能提供可伸缩性来满足大量的新客户,为了解决当前企业应用的迫切需求,我们需要一种基于NIO技术的兼顾高效并发与业务扩展两方面的服务器模型。
  
  二、研究现状
  
  JDK1.4提供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,在NIO中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分利用多个CPU的处理能力,减少处理时间,达到提高服务能力的目的。许多基于NIO的多线程服务器程序往往直接用基于选择器(Selector)的Reactor模式实现,这种简单的事件机制对于较复杂的服务器应用,显然缺乏扩展性和可维护性,而且缺乏直观清晰的结构层次[4]。
  文献[4]针对上述问题提出了基于事件回调思想下的NIO多线程服务器,但该服务器设计的运行时Socket分发机制无法正常的对SocketChannel
  (套接字通道)进行处理。文献[4]设计将新接收的客户端通道放在连接接收线程中进行select,当客户端有数据到达时,socket被分配给了处理线程。在任意给定时刻最多只能有一个线程对SocketChannel进行读取和写入操作[5],而客户端数据到达时连接接收线程仍然在对SocketChannel进行select,导致了连接接收线程与处理线程对客户端SocketChannel的访问发生冲突。本文提出的使用多线程套接字分发机制的改良NIO模型很好地解决上述诸多问题。
  在具备清晰的层次与高效的性能的同时,服务器的运算逻辑组织方式是决定服务器扩展性的主要因素。例如一个网络服务器需要向手持PDA终端提供采集数据处理服务,当出现不同接口协议的PDA终端时,服务器必须对新协议进行支持。在服务器开发设计过程中往往只重视服务器的性能而忽视了服务器的再编程能力,这导致某一种特殊应用的网络服务器扩展性较低或是扩展难度较大。本文使用改良NIO模型的事件回调机制为接口,以NIO模型的线程池业务数据扩展框架的运行载体,构建了一个网络应用服务器模型,提供了一个具备高效性与扩展性的服务器开发模型解决方案。
  
  三、多线程套接字分发NIO模型
  
  多线程套接字分发NIO模型是本文网络服务器架构中的通信层与事件接口层模型,也是数据处理层的基础,向数据层提供了事件回调接口以及TCP数据发送接口。
  (一)模型结构
  如图1所示,NIO模型基本可分为以下模块: 

  1.通讯层
  客户端代理(TcpClient/TcpClientPool):Tcp客户端在服务器端的镜像,包含了该客户端链路的所有信息,并提供了数据发送的方法。客户端代理主要包括套接字通道与输入缓冲区,缓冲区大小是应用需求而定。
  连接接收器(TcpAcceptor):负责启动服务器的端口监听,并且对生成的监听套接字进行select,接收新连接。
  链路处理器(TcpProcessor/TcpProessorPool):负责处理已分配的链路事件,驱动事件接口进行业务运算。服务器将根据链路处理器数量均匀分配客户端代理,通过实现定义的链路处理器池(TcpProessorPool)实现线程池的功能。由于该模型下的高并发服务器所服务的客户端通讯流量相对比较均匀,因此每一个链路处理器将会对该处理器内部的socket套接字通道进行select,处理器之间并不交换客户端代理。
  2.事件层
  事件通知器(EventNotifier):向上层应用提供了事件注册方法,并向底层通讯提供事件驱动的方法,即register/notify模式。事件通知器将保存进行了事件注册的业务对象,并在事件触发时以轮询的方式对事件注册者的运算进行驱动。
  事件适配器接口(EventAdapter):定义了通讯事件触发接口,包括OnAccepted(连接建立)、OnRead(数据到达)、OnClose(连接关闭)。
  (二)数据处理流程
  数据的处理流程如图2所示,客户端A、B、C向服务器发起连接,详细步骤如下: 

 如图2所示NIO模型数据处理流程分为以下几个步骤:
  1.客户端向服务器发起连接请求:TcpAcceptor通过select阻塞等待连接到来,当selectedKeys为OP_ACCEPT时进入建立连接的处理流程。

[1] [2] [3]  下一页

Tags:

作者:王伟平 杨思勤
  • 好的评价 如果您觉得此文章好,就请您
      100%(1)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论