Reactor模型

  Reactor 模式基于事件驱动,特别适合处理海量的 I/O 事件

The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by 
one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.

       Reactor线程模型的基本思想是:分而治之 + 事件驱动

1、一个连接里完整的网络处理过程一般分为accept、read、decode、process、encode、send这几个步骤。Reactor将每个步骤抽象成一个网络事件(Task)
2、当每个Task就绪时,Reactor会收到网络通知,会把Task交给绑定了相应Task的Handler执行。

  Reactor模型的核心结构

  • Reactor:响应器,负责响应事件
  • Handler:处理器,负责处理事件
  • Accepror:接收器,是事件处理器的一种,绑定了connect事件。当客户端发起connect操作时,Reactor会把connect事件,交给Acceptor处理。
  单线程模型

 

 

    

  • Reactor对象通过select监控连接事件,收到事件后通过dispatch进行分发
  • 如果是连接建立的事件,则交由 Acceptor 通过accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理
  • 如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler来响应
  • Handler 会完成 read -> 业务处理 -> send 的完整业务流程
    

   优点:不需要并发控制,减少了上下文的切换
   缺点:不能使用多核CPU。一个线程需要处理所有网络时间,当并发量比较大的时候,难堪重负。

  多线程模型

 

 

  

  • 主线程中,Reactor对象通过select 监听连接事件,收到事件后通过 dispatch进行分发
  • 如果是连接建立的事件,则由Acceptor处理,Acceptor通过 accept接受连接,并创建一个 Handler 来处理连接后续的各种事件。
  • 如果不是连接建立事件,则Reactor会调用连接对应的Handler来进行相应
  • Handler 只负责响应事件,不进行业务处理,Handler 通过 read 读取到数据后,会发给 processor 进行业务处理
  • Processor 会在独立的子线程中完成真正的 业务处理,然后将响应结果发给主进程的 Handler处理,Handler 收到响应后通过 send 将响应结果返回给 client

 

    主从多线程模型

 

 

    

  • 主进程中mainReactor对象通过 select监控连接建立事件,收到事件后通过 Acceptor接收,将新的连接分配给某个子进程。
  • 子进程中的 subReactor 将 mainReactor 分配的连接加入连接队列进行监听,并创建一个 Handler 用于处理连接的各种事件
  • 当有新的事件发生时,subReactor 会调用里连接对应的 Handler 来响应
  • Handler完成 read -> 业务处理 -> send 的完整业务流程

特点:

  • 主进程和子进程的职责非常明确,主进程只负责接收新连接,子进程负责完成后续的业务处理
  • 主进程和子进程的交互很简单,主进程只需要把新的连接传递给子进程,子进程无需返回数据
  • 子进程之间是相互独立的,无需同步共享之类的处理(这里仅限于网络模型相关的 select,read,send等无须同步共享,"业务处理"还是有可能需要同步共享的)

 

 

    模型使用了一个线程池reactor thread poll,这样就可以监听多个端口

 

 

     

 

 

posted on 2018-10-22 12:12  溪水静幽  阅读(198)  评论(0)    收藏  举报