文章目录

  • 一、 主从 反应器 ( Reactor ) 多线程 模式
  • 二、 主从 反应器 ( Reactor ) 多线程 工作流程
  • 三、 主从 反应器 ( Reactor ) 多线程 优缺点分析
  • 四、 单个主 Reactor 多个从 Reactor 多线程模型元素
  • 五、 单个主 Reactor 多个从 Reactor 多线程模型工作流程
  • 六、 多个主 Reactor 多个从 Reactor 多线程模型

一、 主从 反应器 ( Reactor ) 多线程 模式


单反应器 ( Reactor ) 单线程模型 弊端 : 反应器 ( Reactor ) 运行在一个线程中 , 同时处理客户端连接 , 与客户端数据收发 , 在高并发的情况下会产生阻塞 ;

主从 反应器 ( Reactor ) 多线程 模式 :

1 . 主反应器 ( MainReactor ) : 运行在独立的 Reactor 主线程中 , 该线程中只负责与客户端的连接请求 ;

2 . 从反应器 ( SubReactor ) : 运行在独立的 Reactor 子线程中 , 该线程中负责与客户端的读写操作 ; 在该子线程中 , 从反应器 ( Reactor ) 监听多个客户端的请求事件 , 如果监听到客户端的数据发送事件 , 将对应的业务逻辑转发给 处理器 ( Handler 进行处理 ) ;

3 . 主反应器 ( MainReactor ) 与 从反应器 ( SubReactor ) 对应关系 : 主反应器在服务器端只有一个 , 但是从反应器在服务器端 , 不只一个 , 可以运行多个 Reactor 子线程 , 每个子线程中运行一个 从反应器 ;

之后的操作与 单反应器 ( Reactor ) 多线程的处理机制一样 ;

4 . 服务器端 处理者 ( Handler ) : Handler 只负责响应业务处理的请求事件 , 不处理具体的与客户端交互的业务逻辑 , 因此不会长时间阻塞 , 其调用 read 方法读取客户端数据后 , 将业务逻辑交给 线程池 ( Worker ) 处理相关业务逻辑 , 处理完毕后 , 将结果返回 , Handler 将该结果写出到客户端 ;

5 . 服务器端 线程池 ( Worker ) : 接收 处理者 ( Handler ) 的请求 , 为将请求对应业务逻辑操作 , 分配给某个独立线程完成 , 执行完成后的结果再次返回给 处理者 ( Handler ) ,

( Handler 读取客户端数据 -> Worker 线程池分配线程执行业务处理操作 -> Handler 将结果回送给客户端 )

6 . 从反应器 ( SubReactor ) 与 线程池 ( Worker ) 对应关系 : 每个从反应器对应一个线程池 , 也就是说每个主反应器 对应多个 从反应器及配套的线程池 ;

二、 主从 反应器 ( Reactor ) 多线程 工作流程


1 . 主反应器监听连接 :

① 主反应器 ( MainReactor ) 监听连接 : 主反应器 ( MainReactor ) 在主线程中 select 监听客户端的连接事件 , 监听到客户端连接事件后 , 将事件交给 接受者 ( Acceptor ) 进行处理 ;

② 接受者 ( Acceptor ) 建立连接 : 接受者 ( Acceptor ) 调用 accept 与客户端建立连接 , 主反应器 ( MainReactor ) 将该连接交给一个 子反应器 ( SubReactor ) 管理该连接 , 这里注意一个子反应器需要管理多个连接 ;

2 . 从反应器管理多个客户端连接 :

① 连接管理队列 : 从反应器 ( SubReactor ) 中维护了一个连接队列 , 队列中的连接都是主反应器传递下来的 ;

② 创建 处理者 ( Handler ) : 从反应器 ( SubReactor ) 接受 主反应器传递的客户端连接 , 将其加入到连接队列中 , 并为该客户端连接创建 处理者 ( Handler ) ;

③ 处理者 ( Handler ) 作用 : 处理者 ( Handler ) 负责处理与对应客户端连接之间的数据交互 , 如从连接中读取客户端数据 , 写出数据到客户端中 ;

3 . 从反应器监听客户端数据上传并进行相应处理 :

① 监听客户端数据上传事件 : 从反应器 ( SubReactor ) 调用 select 方法 , 监听其管理的客户端连接 , 如果客户端有数据上传 , 会触发事件 , 从反应器就会调用该客户端连接对应的 处理者 ( Handler ) 处理事件 ;

② 读取数据并分发事件 : 处理者 ( Handler ) 处理事件 , 首先调用 read 读取客户端上传的数据 , 然后将该数据分发给 线程池 ( Worker ) ;

③ 线程池 ( Worker ) 工作 : 线程池 ( Worker ) 为事件对应的业务逻辑分配线程执行该耗时操作 , 然后将执行结果返回给 Handler ;

④ 处理结果 : 处理者 ( Handler ) 接收到该数据后 , 将结果发送给客户端 ;

三、 主从 反应器 ( Reactor ) 多线程 优缺点分析


1 . 主从 反应器 ( Reactor ) 多线程 模型优点 :

① 分工明确 , 互不干扰 :

  • 主反应器 ( MainReactor ) 在主线程中运行 , 只负责客户端的连接 ;
  • 多个 子反应器 ( SubReactor ) 分别在对应的子线程中运行 , 负责每个客户端连接的数据交互 , 与业务逻辑调度 ; 这里的子反应器和对应的子线程有多个 ;

② 主线程 与 子线程交互简单 : 主线程中 , 主反应器将接受者 ( Acceptor ) 建立好的连接交给子线程中的子反应器 , 除此之外 , 主线程与子线程没有其它的数据交互 ;

2 . 主从 反应器 ( Reactor ) 多线程 模型缺点 : 该模型比较复杂 , 编程时需要封装各个模块 , 如 主反应器 ( MainReactor ) , 子反应器 ( SubReactor ) , 接受者 ( Acceptor ) , 处理者 ( Handler ) , 线程池 ( Worker ) , 代码实现复杂 ;

四、 单个主 Reactor 多个从 Reactor 多线程模型元素


Netty 线程模型是在 主从 反应器 ( Reactor ) 多线程模型的基础上改进而来的 ;

1 . BossGroup : 服务器端运行一个 BossGroup , 负责处理客户端申请连接的 Accept 事件 , Selector 监听客户端的连接事件 , 监听到该事件后 , 会调用 accept 方法 , 建立服务器端与客户端的连接 ;

2 . 客户端连接 : 上述连接的载体是 NIO 中的 套接字通道 ( SocketChannle ) , 将上述 SocketChannle 封装到 NIOSocketChannle 中 ;

3 . WorkerGroup : 与 BossGroup 相对应的是 WorkerGroup , 在 WorkerGroup 中也有 Selector ;

4 . 处理者 ( Handler ) : 将建立好的连接通道 NIOSocketChannle 注册到 WorkerGroup 中的 Selector 中 , 该 Selector 监听客户端的数据传输 , 如果客户端有数据上传 , 被该 Selector 监听到 , 就会将该事件交给 Handler 进行处理 ;

五、 单个主 Reactor 多个从 Reactor 多线程模型工作流程


1 . 监听连接 : BossGroup 中维护了一个 Selector , 该 Selector 只监听 Accept 事件 , 即客户端连接事件 ;

2 . 建立连接 : Selector 监听到 Accept 事件 , 就会调用 accept 方法 , 获取对应的 套接字通道 ( SocketChannel ) , 之后将该套接字通道封装成 NIOSocketChannel ;

3 . 注册通道 : 将上述封装后的 NIOSocketChannel 注册给 Worker 线程的 Selector , 该线程中一直不停的再进行事件循环监听 , 在该线程中维护相关的与客户端的连接通道 ; 注册时 , 会将 Handler 关联对应的 NIOSocketChannel 通道 ;

4 . 处理数据交互 : 当 Worker 线程中的 Selector 监听到客户端连接数据上传事件后 , 就会调用 Handler 处理该事件 ;

六、 多个主 Reactor 多个从 Reactor 多线程模型


1 . BossGroup 线程 : 上述简单模型中 , 只有一个 BossGroup 线程 , 在 Netty 中该线程可以存在多个 , 每个 BossGroup 线程中运行一个 NioEventLoop ;

2 . NioEventLoop 作用 : 在每个 NioEventLoop 中 , 都有一个 Selector , 该 Selector 作用是循环监听 IO 事件 , 如果监听到 IO 事件 , 就处理该 IO 事件 , 然后更新处理任务队列 , 然后继续监听 ;

3 . WorkerGroup : BossGroup 线程监听到连接事件后 , 连接客户端 , 并将封装好的 NIOSocketChannel 注册给 WorkerGroup 中的某个 Selector 上 ;

【Netty】主从反应器 ( Reactor ) 多线程模型相关推荐

  1. 主从reactor 多线程模型

    相比多线程reactor模型,主从reactor多线程模型拥有了一个独立处理 SocketChannel 连接的线程池,当客户端从Acceptor建立连接之后,便将该连接绑定到subreactor 线 ...

  2. reactor多线程模型_Netty运用Reactor模式到极致

    常见的reactor模式有以下三种 单线程reactor 多线程reactor 主从reactor 1.单线程reactor ractor 单线程模式是指所有的I/O操作都在一个NIO线程完成,该线程 ...

  3. 【Netty】反应器 Reactor 模式 ( 单反应器 Reactor 单线程 | 单反应器 Reactor 多线程 )

    文章目录 一. 反应器 ( Reactor ) 模式 二. 反应器 ( Reactor ) 模式两大组件 三. 单反应器 ( Reactor ) 单线程 四. 单反应器 ( Reactor ) 单线程 ...

  4. reactor多线程模型_网络编程模型的演进之路

    在没有IO多路复用的模型的情况下,为了支持高并发采取以下网络模型 一:阻塞IO+多线程 client连接服务器,服务器有一个线程阻塞的调用accept,accept接收到连接后,创建一个线程来读写读写 ...

  5. reactor线程模型_简单了解Java Netty Reactor三种线程模型

    1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...

  6. Netty Reactor线程模型与EventLoop详解

    本文来说下Netty Reactor线程模型与EventLoop 文章目录 EventLoop事件循环 任务调度 线程管理 线程分配 非阻塞传输 阻塞传输 Netty线程模型 单Reactor单线程模 ...

  7. Netty 多线程模型

    0x01: 背景 Java线程模型的演进 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一 在Java领域当时比较流行的是单线程编程 ...

  8. 简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码)

    文章目录 定义 传统网络交互方式 Reactor 模型组成 Netty中`Reactor`模型的实现 Reactor 单线程模式 非主从Reactor模式(单Reactor多线程模型) 主从React ...

  9. Netty工作笔记0037---主从Reactor多线程

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这个主从Reactor多线程模式,其实也是只有一个Reactor主线程,可以看到这个线程负责,监听 ...

最新文章

  1. java框架知识_java框架知识点总结
  2. SAML简介:安全地共享数字身份信息
  3. 牛客 - tokitsukaze and Inverse Number(树状数组+逆序对定理)
  4. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
  5. 如何创建MFC模式对话框与非模式对话框
  6. struts2文件上传,下载
  7. LeetCode 1650. 二叉树的最近公共祖先 III(哈希)
  8. 结合MSDN理解windows service 服务安装的三个类。
  9. spark 源码分析之十九 -- DAG的生成和Stage的划分
  10. QT案例:登录对话框——主窗口
  11. 三星Galaxy S21 FE证件照公布:120Hz高刷直屏+骁龙888处理器
  12. monkey测试小记
  13. UEditor富文本编辑器图片粘贴和上传问题
  14. Hive教程(08)- JDBC操作Hive
  15. 视频怎么加水印?这里有你想要的答案
  16. 弘辽科技:97年农村娃拼多多上卖大虾,带领全村人致富!
  17. win10升级补丁_干掉烦人的win10升级助手gwx
  18. sinkhorn algorithm
  19. 将Shapefile(SHP)转换为Surfer中的网格(GRD)的方法-通用方法。
  20. 今天在QQ群中看到这么一段,广告词新编,太有才了

热门文章

  1. 路由重分布与分布列表
  2. Cracking The Coding Interview5.2
  3. python转载[编码问题]
  4. Visual Studio 2010Beta与Silverlight的更新
  5. Visual C#中的(ListBox)数据绑定
  6. 云计算入门学习资料,linux云计算学习大纲
  7. Python(17)_urllib下的parse的编码解码函数
  8. 用到的 git 命令
  9. c++ 对象指针参数和对象引用参数02
  10. JMeter学习笔记--JMeter常用测试元件