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

  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/coderway/p/4219914.html
Copyright © 2011-2022 走看看