dumplings/senior-or-architect

什么是架构——单服务器高性能模式

Opened this issue · 0 comments

什么是架构——单服务器高性能模式

内容摘自 前端不得不懂的架构知识,侵删。

单服务器高性能模式主要有 PPC(Process Per Connection), TPC(Thread Per Connection), Reactor, Proactor,其中,PPC和TPC均无法支撑高并发的场景,后两者可以应对高并发场景。

PPC(Process Per Connection)

每次有新的连接就新建一个进程去专门处理这个连接的请求

适用情况

服务器连接数没那么多的情况,例如数据库服务器

弊端

  • 创建进程的代价很高,需要分配很多内核资源,需要将内存映像众父进程复制到子进程
  • 父子进程通信复杂,需要通过IPC进行通信
  • 支持的并发连接数量有限
  • 存在CPU调度和切换的代价

TPC(Thread Per Connection)

多线程并发处理模型,每次有新的连接就新建一个线程专门处理这个连接的请求

优点(与PPC相比)

  • 创建线程消耗的资源少
  • 线程间共用进程的存储空间,通信简单

弊端

  • 高并发时仍然会存在性能问题
  • 线程间的互斥和共享引入了复杂度,可能会导致死锁问题
  • 多线程会出现互相影响的情况,某个线程出现异常时可能会导致整个进程退出
  • 存在CPU调度和切换的代价

Reactor

非阻塞同步网络模型,这里 同步 是指用户进程在执行read和send这类I/O操作时是同步的。

PPC和TPC方案的主要问题就是每个连接都要创建进程(线程),连接结束就销毁,耗费资源,通过I/O多路复用并结合线程池解决上述问题,这就是Reactor,通过I/O多路复用统一监听事件,收到事件后分配给某个进程。

Reactor模式核心组成部分

  • Reactor —— 监听和分配事件
  • 处理资源池(进程池或线程池)—— 处理事件

Reactor模式三种典型方案

单Reactor单进程/单线程
  • Reactor中select负责监控连接事件,收到事件后通过dispatch分发
  • 连接事件会通过Acceptor进行处理
  • 非连接事件会通过Handler处理,Handler会完成read、业务处理send的整个流程

优缺点有:

  • 优点:简单,不存在进程间通信
  • 缺点:
    • 只有一个进程,无法发挥多核CPU的性能
    • Handler在处理某个连接上的业务时,整个进程无法处理其它连接事件,很容易导致性能瓶颈

只适用于业务处理非常快速的场景,例如Redis

单Reactor多线程
  • 与上述区别是,Handler只负责响应事件,不进行业务处理,Handler通过read读取到数据后,会发给processor进行业务处理
  • Processor会在独立的子线程中完成真正的业务处理然后将响应结果发给主进程的Handler处理,Handler收到响应后通过send将响应结果返回给client

优缺点有:

  • 优点:能够充分利用多核CPU的处理能力
  • 缺点:
    • 多线程数据共享和访问比较复杂
    • Reactor承担所有事件的监听和响应,只在主线程中运行,瞬间高并发会成为性能瓶颈
多Reactor多进程/线程
  • 父进程和子进程的职责非常明确,父进程只负责接收新连接,子进程负责完成后续的业务处理
  • 父进程和子进程的交互简单,父进程只需要把新连接会给子进程,子进程无须返回数据
  • 子进程之间是相互独立的,无须同步共享之类的处理
  • Nginx、Memcache、Netty均是彩多Reactor多进程实现

Proactor

非阻塞异步网络模型,I/O操作是异步进行的(由操作系统内核完成)

说白了就是将I/O操作从用户进程迁移到内核进程执行,I/O执行完毕后才调用Handler进行业务处理。