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

  • 相关阅读:
    pytorch中tensor张量的创建
    TensorFlow keras 迁移学习
    TensorFlow keras vgg16net的使用
    TensorFlow keras dropout层
    TensorFlow keras卷积神经网络 添加L2正则化
    TensorFlow-keras 100分类
    TensorFlow-keras fit的callbacks参数,定值保存模型
    fashion_mnist多分类训练,两种模型的保存与加载
    keras API的使用,神经网络层,优化器,损失函数,查看模型层数,compile和fit训练
    ZOJ 2974 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/coderway/p/4219914.html
Copyright © 2011-2022 走看看