在提到高性能服务器编程的时候肯定有听过reactor模式,如果只是简单的写一个服务器和客户端建立连接的程序来熟悉一下使用socket函数编程,一般这种情况都是同步方式实现的,服务器阻塞等待客户端的连接,期间服务器不能做其他事情。是不是有更好的实现方式,让服务器可以提高效率,这就是反应堆模式要做的。

  • 同步方式

之前也说了,同步方式是在阻塞等待,会浪费大量的服务器资源,效率不高,如果还不是多线程的话就更加的糟糕,当你在连接下载小视频的时候,别人就下不了(连连接请求都会被服务器忽视),别人就很气。是很简单的单线连接。

  • 多线程方式

那么为了处理多个客户端的连接请求,为每个连接过来的客户端单独开出一个线程进行处理(这里提到的多个线程中的每个线程都是同步方式实现的),每个线程中的每个操作都是阻塞的直到完成。就拿其优点来说,每个线程之间是比较独立的,可以接受不同的请求执行不同的操作,并且由于是同步的方式,对于开发者来说开发也比较简单(可以尽情地使用顺序操作和阻塞操作)。

缺点也比较明显:1.在多线程下使用同步方式是需要加锁的!总要有点难度,要想使用共享资源就需要对这方面用点心;2.这么多线程再切换的时候开销是不能忽略不计的;3.移植性不高,因为有的机子不支持多线程。

下图就是多线程实现的一个web服务器的图例

当服务器开有多个线程,每个线程都相当于一个同步方式实现的web服务器(就上面说的那种),这样看似可以同时接收多个浏览器的请求,但是实则可供连接的数目是固定的,你开了多少个线程就能给多少个浏览器连接,如果需要增加同时连接的浏览器的数量,只能再多加几个线程。同步的一些缺点也依然没有解决。

  • 反应器模式(reactor)

反应器模式听起来名字高大上,简单的来讲就是select、poll、epoll的使用搭建出一个异步方式的web服务器,这里的异步通俗的讲就是,当服务器在等待浏览器连接请求的时候是自由的,不是阻塞的(同步是阻塞等待的),服务器可以干别的事情,当有浏览器的连接请求的时候,服务器被通知,执行回调函数来建立起连接。下面是一个反应堆模式实现的web服务器的图例,分别是连接请求和文件传输请求的web服务器

HTTPHandle是事件处理器,主要负责事件来临之后进行的操作,Initiation Dispatcher核心就是用select、poll、epoll实现的,当有请求到达Initiation Dispacher会通知http handler数据到来,应该去读去解析了,基本是http handle主缆了大部分的工作

缺点就是可能对于http handle来说处理的事务略多会影响一部分性能并且过于冗杂(就是说太重了),读写操作内部本身还是同步的,在读写的过程中会浪费大量时间(毕竟读写比较慢),和之前的前摄器模式的那篇文章作对比来说,前摄器就是把读写操作让给操作系统来做,减少时间浪费,把自身解放出来做其他事情,这就是前摄器和反应堆最大的差距。

参考资料:http://www.kuqin.com/ace-2002-12/Part-One/Chapter-8.htm

反应堆模式(reactor)的更多相关文章

  1. 回调-> 观察者模式->反应堆模式

    关于回调: 回调是观察者模式以及反应堆模式的基础 一句话,回调就是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调.“If you call me, i will ca ...

  2. 反应堆模式最牛的那篇论文--由solidmango执笔翻译

    The Reactor:An Object-Oriented Wrapper for Event-Driven Port Monitoring and Service Demultiplexing 反 ...

  3. 理解Redis的反应堆模式

    1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...

  4. JAVA设计模式—观察者模式和Reactor反应堆模式

    被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...

  5. 事件驱动模式--Reactor

    原文:https://www.cnblogs.com/harvyxu/p/7498763.html 1 Reactor模型 Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思 ...

  6. 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式

    为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...

  7. java NIO的多路复用及reactor模式【转载】

    关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...

  8. Java-技术专区-设计模式-reactor模式

    模型:         反应器模式做法是:汽车是乘客访问的主体(Reactor),乘客上车后,到售票员(acceptor)处登记,之后乘客便可以休息睡觉去了,当到达乘客所要到达的目的地后,售票员将其唤 ...

  9. Reactor模式与Proactor模式

    该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路 ...

随机推荐

  1. JAVA定时任务调度之Timer入门详解(一)

    所谓的Timer,打开jdk的api文档可以看到它的定义:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.通俗点讲就是说:有且仅有一个后台线程对多个业务线程进行 ...

  2. Task log(未)

    Keyword: fatal, crash, dead, out of memory, oom, anr in, non-protected File: main ,sys ,crash

  3. Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集

    S4/HANA里有一个新的UI框架叫做Smart template, 配合ABAP后台的CDS view技术,能够让developer以Metadata driven的方式来开发Fiori应用, 这种 ...

  4. 【转载】MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool inst ...

  5. flask-日料网站搭建

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互. 本节知识:搭建web目录,目前正在copy网站. python环境:python2.7,fla ...

  6. 我的第一个spring_boot项目

    springBoot火了有一段时间了,现在才接触,着实没跟上节奏.. 一.创建项目并跑起来 目的很简单,只要配置好springBoot环境,并成功启动,且能访问到我项目下的任一资源即可 1 下载mav ...

  7. Zabbix实战-简易教程(5)--Proxy和Agent端(源码和yum方式)

    3.3.1 zabbix proxy安装(源码方式) 1.创建目录 mkdir -p /usr/local/zabbix 2.安装必要软件 yum install -y fping(若安装不成功) 或 ...

  8. 一次Oracle宕机切换后产生ORA错误的处理过程

    问题背景 机房意外断电后Oracle主服务器启动失败,Oracle备机接管 为了安全,管理员对于数据库做expdp的逻辑备份.但备份时发现AttributeInstance表备份失败,提示ORA-01 ...

  9. 分享一个android静默安装,安装后重新启动app的方法

    一:需求简介 之前boss提出一个需求,运行在广告机上的app,需要完成自动升级的功能,广告机是非触摸屏的,不能通过手动点击,所以app必须做到自动下载,自动安装升级,并且安装完成后,app还要继续运 ...

  10. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...