Reactor模型与Proactor模型

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 具体实现

  1. Reactor对象通过select监听连接事件,收到事件后通知dispatch进行转发
  2. 如果是连接建立的事件,有acceptor处理,acceptor通过accept接收连接,并创建一个handler来处理连接后续的各种事件
  3. 如果不是连接建立事件,则Reactor会调用连接对应的Handler(第2步中创建的Handler)来进行响应
  4. Handler会完成 read->业务处理->send的完整业务流程

1.2.3 优缺点

  • 简单,没有进程间通信,没有进程竞争,全部在同一个进程内完成
  • 但是单个进程无法发挥多核多CPU的性能
  • Handler在处理某个连接上的业务时(有的业务耗时很长),整个进程无法处理其他连接的事件,很容易导致性能瓶颈
  • 适用于业务处理非常快速的场景。典型的应用是Redis

1.3 单Reactor多线程

1.3.1  具体实现

  1. 主线程中,Reactor对象通过select监听连接事件,收到事件后通过dispatch进行重发
  2. 如果是连接建立事件,交由Acceptor处理,Acceptor通过accept接受连接,并创建一个Handler来处理连接后续的各种事件
  3. 如果不是连接建立事件,则Reactor会调用连接对应的Handler(第2步中的创建的Handler)
  4. Handler只负责响应事件,不进行业务处理;Handler通过read读取数据后,会发给Processor进行业务处理
  5. Processor会在独立的子线程中完成真正的业务处理,然后将响应结果发给主进程的Handler处理,Handler收到响应后通过send将响应结果返回给client

1.3.2 优缺点

  • 多线程数据共享和访问比较复杂。例如,子线程完成业务处理后,要把结果传递给主线程的Reactor进行发送,这里涉及到共享数据和互斥和保护机制
  • Reactor承担所有事件的监听和响应,只在主线程中运行,瞬间高并发时成为性能瓶颈

1.3.3 为什么不用单Reactor多进程

  • 多进程间通信更加麻烦,多线程至少共享数据
  • 所以多线程下,因为可以共享内存空间,所以他们可以操作同一个连接
  • 但是在多进程下,无法共享内存空间。当处理同一个连接时,还需要给子进程分配这个连接的副本,同时要保证连接数据同步。所以太复杂了,不用

1.4 多Reactor多线程/进程

1.4.1 具体实现

  1. 父进程中mainReactor对象通过select监听连接建立事件,收到事件后通过Acceptor接收,将新的连接分配给某个子进程
  2. 子进程的subReactor将mainReactor分配的连接加入连接队列中进行监听,并创建一个Handler用于处理连接的各种事件
  3. 当有新的事件发生时,subReactor会调用连接对应的Handler(第2步中创建的Handler)来进行响应
  4. Handler完成read->业务处理->send的完整业务流程

1.4.2 优缺点

  • 实际实现起来比单Reactor多线程还要简单
  • 父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理
  • 父子进程的交互很简单,父进程只需要把新连接传递给子进程,子进程无序返回数据
  • 子进程之间是相互独立的,无须数据同步共享之类的处理
  • Niginx是基于多Reactor多进程实现的
  • Netty和Memcache是基于多Reactor多线程实现

2. Rroactor模型

2.1 概念

  • Reactor是非阻塞同步网络模型,因为真正的read和send操作都需要用户进程同步操作
  • Proactor模型是基于异步IO的模型,进一步提升性能

2.2 具体实现

  1. Proactor Initiator负责创建Proactor和Handler,并且将Proactor和Handler都通过Asynchronous Operation Processor注册到内核 
  2. Asynchronous Operation Processor负责处理注册请求,并完成IO操作
  3. Asynchronous Operation Processor完成IO操作后通知Proactor
  4. Proactor根据不同的事件回调不同的Handler进行业务处理
  5. Handler完成业务处理,Handler也可以将新的Handler注册到内核进程

2.3 优缺点

  • 理论上效率比Reactor要高。异步IO能充分利用DMA特性,让IO与计算重叠
  • 但是实现起来很困难

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值