zoukankan      html  css  js  c++  java
  • 单服务器高性能模式:Reactor 与Proactor

    极客时间:《从 0 开始学架构》:单服务器高性能模式:Reactor 与Proactor

    1、引言

    单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发的场景,尤其是互联网发展到现在,各种海量用户业务的出现,PPC 和 TPC 完全无能为力。本节讲述下应对高并发场景的单服务器高性能架构模式:Reactor 和 Proactor。

    2、Reactor

    PPC 模式最主要的问题就是每个连接都要创建进程(TPC线程类似),连接结束后进程就销毁了,造成了很大的浪费。因此,想到了资源复用,即创建一个线程池,将连接分配给进程,一个进程可以处理多个连接的业务。
    引入资源池也会引入一个新的问题,进程如何高效的处理多个连接的业务?
    处理流程:“read -> 业务处理 -> write”,当都有数据时,进程一个接一个的处理,但若当前连接没有数据时,read操作就阻塞到那了。最简单的方式就是将read操作改为非阻塞方式,然后进程不断地轮询多个连接。虽然能够粗暴的解决问题,但轮询除消耗CPU 不说,当一个进程处理多个连接时,轮询效率就会很低l。
    很容易想到,只有当连接上有数据的时候进程才去处理,这就是 I/O 多路复用技术的来源。
    I/O 多路复用技术归纳起来有两个关键实现点:

    • 当多条连接共用一个阻塞对象后,进程只需要在一个阻塞对象上等待,而无须再轮询所有连接,常见的实现方式有 select、epoll、kqueue 等。
    • 当某条连接有新的数据可以处理时,操作系统会通知进程,进程从阻塞状态返回,开始进行业务处理。

    I/O 多路复用结合线程池,即:Reactor,中文是“反应堆”,是“事件反应”的意思,通俗来讲就是“来了一个事件我就有相应的反应”,“我”就是Reactor,具体的反应就是我们写的代码。Reactor 会根据事件类型来调用相应的代码进行处理。Reactor 模式也叫 Dispatcher 模式,I/O 多路复用统一监听事件,收到事件后分配(Dispatch)给某个进程。

    Reactor 模式的核心组成部分包括 Reactor 和处理资源池(进程池或线程池),其中 Reactor 负责监听和分配事件,处理资源池负责处理事件。
    最终 Reactor 模式有这三种典型的实现方案:

    • 单 Reactor 单进程 / 线程。
    • 单 Reactor 多线程。
    • 多 Reactor 多进程 / 线程。

    2.1、单 Reactor 单进程 / 线程

    单 Reactor 单进程 / 线程的方案示意图如下(以进程为例):

    注意,select、accept、read、send 是标准的网络编程 API,dispatch 和“业务处理”是需要完成的操作,其他方案示意图类似。
    注解:

    • Reactor 对象通过 select 监控连接事件,收到事件后通过 dispatch 进行分发。
    • 如果是连接建立的事件,则由 Acceptor 处理,Acceptor 通过 accept 接受连接,并创建一个 Handler 来处理连接后续的各种事件。
    • 如果不是连接建立事件,则 Reactor 会调用连接对应的 Handler(第 2 步中创建的 Handler)来进行响应。
    • Handler 会完成 read-> 业务处理 ->send 的完整业务流程。
      优点:
    • 简单,没有进程间通信,没有进程竞争,全部都在同一个进程内完成。

    缺点:

    • 只有一个进程,无法发挥多核 CPU 的性能;只能采取部署多个系统来利用多核 CPU,但这样会带来运维复杂度,本来只要维护一个系统,用这种方式需要在一台机器上维护多套系统。
    • Handler 在处理某个连接上的业务时,整个进程无法处理其他连接的事件,很容易导致性能瓶颈。

    因此,该方案只适用于业务处理非常快速的场景,目前比较著名的开源软件中使用单 Reactor 单进程的是 Redis。

    2.2. 单 Reactor 多线程

    单 Reactor 多线程方案示意图是:

    注解:

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

    优点:

    能够充分利用多核多 CPU 的处理能力

    缺点:

    多线程数据共享和访问比较复杂
    Reactor 承担所有事件的监听和响应,只在主线程中运行,瞬间高并发时会成为性能瓶颈。

    3.3、多 Reactor 多进程 / 线程

    多 Reactor 多进程 / 线程方案示意图是(以进程为例):

    方案详细说明如下:

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

    多 Reactor 多进程 / 线程的方案看起来比单 Reactor 多线程要复杂,但实际实现时反而更加简单,主要原因是:

    • 父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理。
    • 父进程和子进程的交互很简单,父进程只需要把新连接传给子进程,子进程无须返回数据。
    • 子进程之间是互相独立的,无须同步共享之类的处理(这里仅限于网络模型相关的 select、read、send 等无须同步共享,“业务处理”还是有可能需要同步共享的)。

    3、Proactor

    Reactor 是非阻塞同步网络模型,因为真正的 read 和 send 操作都需要用户进程同步操作。这里的“同步”指用户进程在执行 read 和 send 这类 I/O 操作的时候是同步的,如果把 I/O 操作改为异步就能够进一步提升性能,这就是异步网络模型 Proactor。
    Proactor 中文翻译为“前摄器”,Reactor 可以理解为“来了事件我通知你,你来处理”,而 Proactor 可以理解为“来了事件我来处理,处理完了我通知你”。这里的“我”就是操作系统内核,“事件”就是有新连接、有数据可读、有数据可写的这些 I/O 事件,“你”就是我们的程序代码。

    • Proactor Initiator 负责创建 Proactor 和 Handler,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核。
    • Asynchronous Operation Processor 负责处理注册请求,并完成 I/O 操作。
    • Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor。
    • Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理。
    • Handler 完成业务处理,Handler 也可以注册新的 Handler 到内核进程。

    理论上 Proactor 比 Reactor 效率要高一些,异步 I/O 能够充分利用 DMA 特性,让 I/O 操作与计算重叠,但要实现真正的异步 I/O,操作系统需要做大量的工作。目前 Windows 下通过 IOCP 实现了真正的异步 I/O,而在 Linux 系统下的 AIO 并不完善,因此在 Linux 下实现高并发网络编程时都是以 Reactor 模式为主。

  • 相关阅读:
    非系统表空间损坏,rman备份恢复
    非系统数据文件损坏,rman备份恢复
    开启 控制文件自动备份下,参数文件、控制文件全部丢失恢复
    rman命令详解(三)
    Block Change Tracking (块改变跟踪)
    如何加快建 index 索引 的时间
    RMAN兼容性、控制文件自动备份、保存时间、备份策略、备份脚本(二)
    rman理论(一)
    动态参数与静态参数的判断、修改
    闪回之 Flashback Data Archive
  • 原文地址:https://www.cnblogs.com/whiteBear/p/15731844.html
Copyright © 2011-2022 走看看