1. Reactor模型
1.1 什么是Reactor模式
- 它是基于IO多路复用与线程池
- Reactor模式的核心组成部分包括Reactor和处理资源池(进程池或线程池)
- Reactor负责监听和分配事件。
- 处理资源池负责处理事件
- Reactor模式具体实现灵活多变
- Reactor的数量可以变化,可以是一个或多个
- 资源池的数量可以变化,以进程为例,可以是一个或多个
- Reactor模式具有三种经典的实现方案
- 单Reactor单进程/单线程
- 单Reactor多线程
- 多Reactor多进程/线程
1.2 单Reactor单进程/线程
1.2.1 说明
- select,accept,read,send都是标准的网络编程api。由系统实现
- dispatch和“业务处理”是需要开发人员完成的操作
1.2.2 具体实现
- Reactor对象通过select监听连接事件,收到事件后通知dispatch进行转发
- 如果是连接建立的事件,有acceptor处理,acceptor通过accept接收连接,并创建一个handler来处理连接后续的各种事件
- 如果不是连接建立事件,则Reactor会调用连接对应的Handler(第2步中创建的Handler)来进行响应
- Handler会完成 read->业务处理->send的完整业务流程
1.2.3 优缺点
- 简单,没有进程间通信,没有进程竞争,全部在同一个进程内完成
- 但是单个进程无法发挥多核多CPU的性能
- Handler在处理某个连接上的业务时(有的业务耗时很长),整个进程无法处理其他连接的事件,很容易导致性能瓶颈
- 适用于业务处理非常快速的场景。典型的应用是Redis
1.3 单Reactor多线程
1.3.1 具体实现
- 主线程中,Reactor对象通过select监听连接事件,收到事件后通过dispatch进行重发
- 如果是连接建立事件,交由Acceptor处理,Acceptor通过accept接受连接,并创建一个Handler来处理连接后续的各种事件
- 如果不是连接建立事件,则Reactor会调用连接对应的Handler(第2步中的创建的Handler)
- Handler只负责响应事件,不进行业务处理;Handler通过read读取数据后,会发给Processor进行业务处理
- Processor会在独立的子线程中完成真正的业务处理,然后将响应结果发给主进程的Handler处理,Handler收到响应后通过send将响应结果返回给client
1.3.2 优缺点
- 多线程数据共享和访问比较复杂。例如,子线程完成业务处理后,要把结果传递给主线程的Reactor进行发送,这里涉及到共享数据和互斥和保护机制
- Reactor承担所有事件的监听和响应,只在主线程中运行,瞬间高并发时成为性能瓶颈
1.3.3 为什么不用单Reactor多进程
- 多进程间通信更加麻烦,多线程至少共享数据
- 所以多线程下,因为可以共享内存空间,所以他们可以操作同一个连接
- 但是在多进程下,无法共享内存空间。当处理同一个连接时,还需要给子进程分配这个连接的副本,同时要保证连接数据同步。所以太复杂了,不用
1.4 多Reactor多线程/进程
1.4.1 具体实现
- 父进程中mainReactor对象通过select监听连接建立事件,收到事件后通过Acceptor接收,将新的连接分配给某个子进程
- 子进程的subReactor将mainReactor分配的连接加入连接队列中进行监听,并创建一个Handler用于处理连接的各种事件
- 当有新的事件发生时,subReactor会调用连接对应的Handler(第2步中创建的Handler)来进行响应
- Handler完成read->业务处理->send的完整业务流程
1.4.2 优缺点
- 实际实现起来比单Reactor多线程还要简单
- 父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理
- 父子进程的交互很简单,父进程只需要把新连接传递给子进程,子进程无序返回数据
- 子进程之间是相互独立的,无须数据同步共享之类的处理
- Niginx是基于多Reactor多进程实现的
- Netty和Memcache是基于多Reactor多线程实现
2. Rroactor模型
2.1 概念
- Reactor是非阻塞同步网络模型,因为真正的read和send操作都需要用户进程同步操作
- Proactor模型是基于异步IO的模型,进一步提升性能
2.2 具体实现
- Proactor Initiator负责创建Proactor和Handler,并且将Proactor和Handler都通过Asynchronous Operation Processor注册到内核
- Asynchronous Operation Processor负责处理注册请求,并完成IO操作
- Asynchronous Operation Processor完成IO操作后通知Proactor
- Proactor根据不同的事件回调不同的Handler进行业务处理
- Handler完成业务处理,Handler也可以将新的Handler注册到内核进程
2.3 优缺点
- 理论上效率比Reactor要高。异步IO能充分利用DMA特性,让IO与计算重叠
- 但是实现起来很困难