高性能网络模型
Reactor
单Reactor单线程/进程模型
- Reactor对象的作用是监听和分发事件
- Accept的作用是来获取连接的
- Handler就是来处理业务的
执行流程
- Reactor对象通过select(IO多路复用接口)监听事件,收到后通过dispatch进行分发,具体是发给Handler还是Acceptor还得看具体的事件
- 如果是建立连接的请求,就交给Acceptor处理,通过accept方法建立连接并且生成一个handler处理后续的事情
- 如果不是连接事件就交给Handler区处理
缺点
- 只有一个线程或者进程,无法充分利用CPU的性能
- 如果在Handler处理事件的时候,整个整个线程无法处理其他的事件
单Reactor多线程
执行流程
- Reactor 对象通过 select (IO 多路复⽤接⼝) 监听事件,收到事件后通过 dispatch 进⾏分发,具体分发给 Acceptor 对象还是 Handler 对象,还要看收到的事件类型;
- 如果是连接建⽴的事件,则交由 Acceptor 对象进⾏处理,Acceptor 对象会通过 accept ⽅法 获取连接,并创建⼀个 Handler 对象来处理后续的响应事件;如果不是连接建⽴事件, 则交由当前连接对应的 Handler 对象来进⾏响应
- Handler不再负责业务处理,只负责数据的接收和发送,Handler在read读取数据之后,会将数据发送给子线程的Process去处理
缺点
- 只有一个Reactor负责接收和监听的话,在面对高并发的时候,可能成为性能瓶颈
多Reactor多线程
执行流程
- 主线程中的MainReactor对象通过select监控建立事件,收到事件之后通过Acceptor对象接力起连接,并将连接派发给某个子线程
- 子线程中的subReacotr对象将MainReactor对象分配的连接加入到select继续监听,并创建一个Handler处理相应的事件
Proactor
定义:Reactor是非阻塞同步网络模式,Proactor是异步网络模型
Reactor和Proactor的区别
- Reactor是非阻塞同步网络模式,感知的是就绪可读事件。每次感知到有事件发生的时候,就需要应用程序主动调用read方法,完成数据的读写,也就是应用程序主动将socket接收缓存中的数据读到应用内存中,这个过程是同步,读完数据之后才能处理数据
- Proactor是异步网络模型,感知的是已完成的读写事件,读写都是用操作系统完成的,不需要像Reactor一样主动发起read/write来读写数据
Proactor的流程
- Proactor Initiator负责创建Proactor和Handler,并将Proactor和handler都通过Asynchronous Operation Processor 注册到内核
- Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作
- Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor
- Proactor 根据不同的事件类型回调不同的 Handler 进⾏业务处理;
- Handler 完成业务处理