设计模式 - 2. Reactor VS Proactor (通过Web服务器的多种实现方案来比较Reactor与Proactor)

时间:2022-09-09 14:20:38

TODO

一、概述

对于并发应用,同步多线程是目前比较流行的机制。但是线程会消耗额外的资源,并且多线程编程需要对同步机制有很深的理解,因此目前越来越多的操作系统都提供了异步并发机制,保留了并发的好处,同时还消除了线程的资源损耗以及多线程编程的复杂性。
Proactor模式就是为了描述如何有效利用操作系统的异步机制,而被提出的一种异步并发模式。使用该模式,当应用执行调用异步操作时,由操作系统代表应用来执行操作,无需应用持有相关的线程。这种模式简化了并发变成,提高了性能,并且只需更少的线程数。

二、通过典型的web服务器来比较Reactor与Proactor

典型的Web服务器结构

设计模式 - 2. Reactor VS Proactor (通过Web服务器的多种实现方案来比较Reactor与Proactor)

典型Web服务器的工作工程如下:

  1. 浏览器发送HTTP GET请求到Web服务器;
  2. Web服务器收到请求后进行解析和验证;
  3. Web服务器处理请求,上图所示的是读取文件服务器;
  4. Web服务器将处理结果(图中所示是一个文件)发送给浏览器

要开发高性能的Web服务器,需要解决如下问题:

  • 并发:服务器必须能同时处理多个客户端的请求
  • 效率:服务器必须尽量减少延时,增大吞吐量,并尽量减少CPU的- 消耗
  • 易编码:服务器的设计应该使用简单而高效的并发策略
  • 易适配:集成新的或改进的传输协议(如HTTP1.1)应该无需太大改动

可以使用多种并发策略来实现web服务器,如多个同步线程、reactive同步事件分发、proactive异步事件分发等。下面我们将逐条介绍这些策略。

注:此处的同步并不是指多个线程访问竞争条件时需要上锁这种同步,而是指两个操作是有先后关系的。

1. 多个同步线程

服务器开启多个线程同时处理各客户端发来的HTTP GET请求。每个线程都要同步的进行建立连接、读取HTTP请求、解析请求和文件传输操作。也就是说各操作都阻塞直到完成。
此方案的优点在于实现简单。服务器对客户端A的处理,与对客户端B的处理是基本独立的,线程之间没什么共享数据,因此不需要特别的同步。
设计模式 - 2. Reactor VS Proactor (通过Web服务器的多种实现方案来比较Reactor与Proactor)
处理过程:

  1. 线程在服务器上阻塞等待接收socket调用;
  2. 同步地读取客户端的HTTP 请求;
  3. 解析请求;
  4. 同步地读取请求的文件;
  5. 同步地发送文件给客户端;

缺点:
需要复杂的同步机制:多个线程同时访问服务器的共享资源(如缓存文件等)时,需要进行同步
高并发时消耗太多资源:线程上下文切换,同步,以及CPU之间的数据移动会严重降低web服务器性能。

2. Reactive同步事件分发

TODO

原文:

http://www.cs.wustl.edu/~schmidt/PDF/proactor.pdf