- 堵塞IO模型:每个连接都由独立的线程进行处理。当并发度较高时系统资源占用较大,并且如果线程发生了IO堵塞还会浪费线程资源
- Reactor模型:reactor线程监听,并分发事件给相应的handler
- Proactor模型:交由系统进行异步处理,感知完成的处理事件
Reactor模型
单reactor单线程
-
reactor通过io复用接口监听客户端请求事件,然后进行分发
-
若是建立连接请求事件,则由acceptor接受请求,然后创建handler处理具体业务处理
若非建立连接请求,直接交由相应handler进行处理
单线程模式简单,没有多线程、进程通信、竞争问题,但是也无法发挥多核CPU性能,并且在线程意外终止或者进入死循环的情况下容易导致整个故障
更加适合io密集型的场景,比如redis
单reactor多线程
-
reactor通过io复用接口监听客户端请求事件,然后进行分发
-
若是建立连接请求事件,则由acceptor接受请求,然后创建handler处理具体业务处理
若非建立连接请求,直接交由相应handler进行响应
-
handler接受事件之后分发worker线程池进行具体业务处理
多线程模式充分利用了多核处理能力,只是单reactor监听、分发、响应容易在高并发情况下成为性能瓶颈
主从reactor多线程
-
main reactor负责监听客户端请求事件,并分发
-
若是建立连接请求事件,则由acceptor进行连接
若非建立连接请求,直接交由sub reactor将连接加入到连接队列进行监听,并创建handler处理
-
handler读取数据后,再交予worker线程池处理
主从reactor模式相对来说还是比较复杂的
Proactor模型
proactor采用异步网络,感知已完成的io事件。
- initiator:初始化异步操作;向异步操作处理器注册completion dispatcher、completion handler
- completion handler(acceptor, http handler):由应用程序实现的用于异步操作完成通知的completion handler接口。
- asynchronous operation:异步操作代表应用执行请求(例如I/O和定时器操作)。当应用程序调用异步操作时,这些操作不会借用应用程序的控制线程。因此,从应用程序的角度来看,操作是异步执行的。
- asynchronous operation processor:执行异步操作。由系统实现
- completion dispatcher:在异步操作完成之后负责回调completion handler。当异步操作处理器完成一个异步发起的操作时,完成分派器代表它执行一个应用程序回调。
以下是proacotr网页服务器发起http GET请求的演示
- client发起GET请求
- 由系统读取完毕之后通知completion dispatcher
- completion dispatcher通知http handler处理
- http handler解析请求
- http handler同步读取请求文件
- http handler初始化异步处理,去写入数据到client连接,并将自己作为一个Completion handler和一个Completion Dispatcher的引用传递给http handler,该引用将用于在异步写入完成时通知http handler;
- 当写入操作完成之后,系统通知completion dispatcher
- completion dispatcher通知completion handler
Ref
- https://www.cnblogs.com/chenssy/p/15440348.html
- https://cloud.tencent.com/developer/article/1488120
- https://www.dre.vanderbilt.edu/~schmidt/PDF/Proactor.pdf