Reactor线程模型

发布于 2021-05-31  519 次阅读


目前存在的线程模型有:
  1. 传统的堵塞I/O服务模型
  2. Reactor模式
  3. Proactor模式

一,传统堵塞I/O线程模型

模型特点:
  • 采用堵塞I/O模式获取输入的数据
  • 每一个连接对应一个线程完成数据的输入,业务处理,数据的返回
 
问题分析:
  • 当并发数很大,就会创建大量的线程,占用很大的系统资源
  • 连接创建后,如果当前线程暂时没有数据可读,该线程会堵塞在read操作上,造成线程资源浪费

二,Reactor模式

Reactor本质是基于NIO模型上的一种方法论,优化了传统的NIO架构,在NIO基础上在建立一套框架,netty就源于这套Reactor框架模式
针对传统的堵塞I/O服务模型的2个缺点,解决方案:
      1,基于I/O复用模型:多个连接共用一个堵塞对象,应用程序只需要在一个堵塞对象等待,无需堵塞等待的所有连接,当某个连接有新的数据可以处理,操作系统通知应用程序,线程从堵塞状态返回,开始进行业务处理
 
     2,基于线程池复用线程资源:不必再为每一个连接创建线程,将连接完成后的业务处理任务分配给线程池进行处理,一个线程可以处理多个连接的业务
注:I/O复用模式是基于NIO的selector的多路复用器原理,在Reactor模式中I/O复用做了增强,Reactor其实也是基于NIO模型,在Reactor中I/O复用模式又叫1,反应器模式 2,分发者模式 3,通知者模式
I/O复用结合连接池,就是Reactor模式基本设计思想:
  1. Reactor模式,通过一个或者多个输入同时传递给服务处理器的模式(事件驱动型)
  2. 服务器端程序处理传入的多个请求并将它们同步分派到相应的线程进行处理,集中调度分别处理,因此reactor模式也叫Dispatcher模式
 
Reactor模式的核心组成部分:
  • Reactor:就是相当于图中的ServerHandler,在一个单独的线程中启动,负责监听和分发事件,分发给适当处理程序来对IO事件做出反应,就相当于我们的快递员,在商家拿货,然后派件给你,你拆开使用
  • Handler:处理程序执行I/O事件完成的实际事件的非堵塞操作
Reactor模式的分类:
  • 单Reactor单线程模型
  • 多Reactor多线程模型
  • 主从Reactor多线程模型(netty基础)
注:Netty的线程模式主要是基于Reactor多线程模型并做了一定改进
 
三种模式的理解(以培训机构为例):
  1. 单Reactor单线程:课程的销售和讲师是同一个人
  2. 单Reactor多线程:有一个课程销售,但有多个讲师
  3. 主从Reactor多线程:多个课程销售,多个讲师
Reactor具备的优点:
  • 响应快:不必为单个同步事件所堵塞,虽然Reactor本身依旧是同步
  • 拓展性好:可以方便的通过增加Reactor实例个数来充分利用CUP资源
  • 复用性好:Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性
  • 可以最大程度的避免复杂线程及同步问题,并且避免了多线程、进程的切换开销

一,单Reactor单线程模型

模型说明:
  1. select是NIO中多路复用模型,可以实现应用程序通过一个堵塞对象监听多路连接
  2. Reactor对象通过select监控客户端请求事件,收到事件后通过Dispatcher进行
  3. Reactor如果接收的是连接请求,就调用Acceptor处理连接请求然后创建一个Handler对象处理连接完成后的后续业务处理
  4. 如果非连接请求事件,则Reactor会分发调用连接对应的Handler来响应
  5. Handler会完成Read(读取数据或者请求) -> 业务处理 -> Send(回送处理完成数据)的业务流程