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,这样就可以监听多个端口

立志如山 静心求实
浙公网安备 33010602011771号