高性能网络I/O模型之Reactor和Proactor

Reactor(反应器模式、分发器模式)

非阻塞同步网络模型。基于I/O多路复用结合线程池复用,多个连接公用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需轮询阻塞等待所有连接,常见的实现方式有select,epoll,kqueue等;当某个连接有新的数据可以处理时,操作系统通知应用程序使得线程从阻塞状态返回,然后分派到相应的处理线程开始进行业务处理。

Reactor模式中有两大核心组成:ReactorHandlers

  • Reactor
    在单独一个线程中运行,负责监听和分发事件
  • Handlers
    处理程序执行I/O事件要完成的实际事件
高性能网络I/O模型之Reactor和Proactor_第1张图片
image.png

单Reactor单线程模型

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

高性能网络I/O模型之Reactor和Proactor_第2张图片
单Reactor单线程

优缺点:
1)模型简单、没有多线程、进程通信、竞争问题。
2)只有一个线程,无法发挥多核CPU性能,容易产生性能瓶颈
3)可靠性低,如果线程意外终止,或者进入死循环, 会导致整个系统通信模块不可用。
4)Handler在处理某个连接的业务时,其他连接的事件无法被处理

使用场景:
仅适用于客户端数量有限,业务处理非常快速的场景,比如redis。

单Reactor多线程模型

为了解决单Reactor单线程的缺点,引入了单Reactor多线程模型。

在主线程中,Reactor对象通过select监控连接事件,收到事件之后通过dispatch进行分发;如果是连接建立事件,交给Acceptor处理,Acceptor通过accept接受连接,并为其创建一个Handler来处理后续的各种事件。如果不是连接建立事件,则Reactor调用连接对应的Handler来响应,其中Handler只负责响应事件,不进行业务处理,Handler通过read读取到数据后,然后传递给Worker交给线程池取执行,Worker执行过完之后将响应结果发给主线程的Handler处理,Handler再将响应结果通过send**发送给客户端。

高性能网络I/O模型之Reactor和Proactor_第3张图片
单Reactor多线程

优缺点:
1)充分发挥利用多核CPU处理能力,提升性能
2)多线程数据共享和访问的处理比较复杂,reactor在单线程中处理所有的事件监听和响应,在高并发场景下容易产生性能瓶颈
3)Reactor承担所有事件的监听和响应,只在主线程这个单线程中运行,瞬间高并发会使其成为性能瓶颈。

主从Reactor多线程模型

Reactor主线程通过select监听连接事件,收到事件后通过Acceptor处理连接事件,当Acceptor处理连接事件后,主Reactor将连接分配给某个子线程的SubReactor,subReactor将连接加入监听队列中,并创建handler进行各种事件的处理,当有新事件发生,subReactor调用对应handler处理,handler读取数据完之后通过交给worker线程池进行处理。

高性能网络I/O模型之Reactor和Proactor_第4张图片
主从Reactor多线程模型

优缺点:
1)父线程与子线程数据交互简单、职责明确,父线程只负责接收新连接,子线程完成后续业务处理。
2)编程复杂度高

著名开源系统Nginx采用的就是主从Reactor多进程模型,Memcache和Netty采用Reactor多线程模型。

Proactor

非阻塞异步网络模型。Proactor核心思想就是,当来了事件,由操作系统进行处理(即从硬件读取到内核以及内核读取到用户态),处理完之后通知应用程序。

整个Proactor方案为在我们应用程序中有一个Proactor Initiator负责Proactor和Handler,并将Proactor和Handler通过Asynchronous Operation Processor注册到内核。Asynchronous Operation Processor负责处理注册请求,完成I/O操作,当其完成I/O的操作后,通知Proactor,Proactor根据不同事件类型回调不同的Handler进行业务处理。

高性能网络I/O模型之Reactor和Proactor_第5张图片
Proactor模型

图片引用自:从0开始学架构

Reactor和Proactor区别

看到一个形象的解释:Reactor相当于到饭点了,保姆通知你去做饭;Proactor是到饭店了,你告诉保姆饭桌在哪,保姆做完饭放到饭桌上,然后通知你。

参考

  • 《从0开始学架构》
  • 尚硅谷Netty教程
  • https://gitee.com/alan-tang-tt/reactor

你可能感兴趣的:(高性能网络I/O模型之Reactor和Proactor)