zoukankan      html  css  js  c++  java
  • 基于NIO的服务器模型

    最简单服务器模型是thread-per-connection,即每个客户端连接对于一个专属的工作线程,工作线程等待客户端发送数据、接收处理数据、返回响应数据然后继续等待新的数据的到来,这种模型能够保证很好的响应速度,但如果有大量并发连接会导致大量的工作线程,而且这些线程浪费了很多时间等待新数据,这些导致了这种服务器模型不适合高并发的情况。

    如果服务器需要应对大量但可能并不实时活跃的连接,那么thread-on-event模型就比较适合。这种模型工作线程独立于客户端连接,只用来处理特定的事件,例如当有数据到来时(data received event),工作线程在应用级别处理这些数据提供或者启动服务。这种模型需要socket io使用非阻塞的方式,同时需要事件监测机制。这种模型被称为消息驱动模型(Reactor Pattern)。

    基于NIO的消息驱动模型:

    Dispatcher维护一个Selector,客户端连接注册到Selector,当有数据可读可写时,Dispatcher触发响应的事件。

    通常消息驱动模型服务器的组件:

    Acceptor主要负责接收新的连接请求并将其注册到Dispather中。其中维护了ServerSocketChannel,通常采用阻塞的方式。也可以用来实现连接统计,负载均衡。

    Dispatcher,因为不同平台的Selector实现差异比较大,通常会使用多个(大部分服务器用了两个),用一个Dispatcherpool维护,主要负责检测SocketChannel的注册、以及读写事件。需要注意Selector的key set不是线程安全的,不同线程中更新、读取需要同步。

    Dispatcher-level EventHandler 用来处理读写事件,读取数据加入到Connection的read/write queue中供后续处理。

    Application-level EventHandler根据提供的服务处理队列中的数据。

    该模型的简单实现

    https://github.com/littlecoderonway/BaseServer.git

    参考资料:

    http://rox-xmlrpc.sourceforge.net/niotut/

    https://today.java.net/pub/a/today/2007/02/13/architecture-of-highly-scalable-nio-server.html

    http://marlonyao.iteye.com/blog/1005690

  • 相关阅读:
    第十五篇: Ajax Control Toolkit 控件包3. DragPanel (拖动效果)
    希望找人一起写个 Ajax 的封装
    第三篇: Silverlight 2.0 下载与安装
    ASP.NET AJAX 1.0 英文文档,视频教程
    第十四篇: 建立 AJAX 母版页 (为了后面例子方便)
    第十三篇: Ajax Control Toolkit 控件包2. CollapsiblePanel (展开和折叠效果)
    几种流行的JS框架的选择
    第二篇: Silverlight 下载与安装
    (原创)WINCE流驱动的动态加载调试
    SQL语法,SQL语句大全,SQL基础(转载)
  • 原文地址:https://www.cnblogs.com/coderway/p/4219914.html
Copyright © 2011-2022 走看看