反应堆模式(reactor)
在提到高性能服务器编程的时候肯定有听过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)的更多相关文章
- 回调-> 观察者模式->反应堆模式
关于回调: 回调是观察者模式以及反应堆模式的基础 一句话,回调就是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调.“If you call me, i will ca ...
- 反应堆模式最牛的那篇论文--由solidmango执笔翻译
The Reactor:An Object-Oriented Wrapper for Event-Driven Port Monitoring and Service Demultiplexing 反 ...
- 理解Redis的反应堆模式
1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...
- JAVA设计模式—观察者模式和Reactor反应堆模式
被观察者(主题)接口 定义主题对象接口 /**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一 ...
- 事件驱动模式--Reactor
原文:https://www.cnblogs.com/harvyxu/p/7498763.html 1 Reactor模型 Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思 ...
- 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式
为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...
- java NIO的多路复用及reactor模式【转载】
关于java的NIO,以下博客总结的比较详细,适合初学者学习(http://ifeve.com/java-nio-all/) 下面的文字转载自:http://www.blogjava.net/hell ...
- Java-技术专区-设计模式-reactor模式
模型: 反应器模式做法是:汽车是乘客访问的主体(Reactor),乘客上车后,到售票员(acceptor)处登记,之后乘客便可以休息睡觉去了,当到达乘客所要到达的目的地后,售票员将其唤 ...
- Reactor模式与Proactor模式
该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路 ...
随机推荐
- [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中
前言 泰凌微TLSR8266蓝牙芯片的开发环境在win桌面系统中搭建起来比较简单,在其论坛SDK版块->Telink IDE中可以找到安装包,直接安装即可生成基于Eclipse的开发环境,及相关 ...
- bootstrapru软件官网
一 bootstrap:http://v3.bootcss.com/ 二 起步:http://v3.bootcss.com/getting-started/ 三 全局css样式:htt ...
- 如何利用git shell提交代码到github
在很早之前我根据找到的一些资料以及自己的实践总结了一篇如何将VS2015上的代码上传到GitHub上,后来我发现有小伙伴私信我,说跟我上面写的不一样,但是那段时间也比较忙,当我发现有人私信的时候差不过 ...
- 【转载】MySQL之权限管理
一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行update操作.只允许你从某台机器上连接m ...
- java指令重排序的问题
转载自于:http://my.oschina.net/004/blog/222069?fromerr=ER2mp62C 指令重排序是个比较复杂.觉得有些不可思议的问题,同样是先以例子开头(建议大家跑下 ...
- 大数据分析中Redis怎么做到220万ops
大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为公司提供运营决策,各种抖机灵甚至异想天开的想法都会紧跟着接踵而来!业务多变,决定了必须每天修改系统,重新跑数据,这就要求极高的海 ...
- Spring Boot快速入门(四):使用jpa进行数据库操作
原文地址:https://lierabbit.cn/articles/5 添加依赖 新建项目选择web,JPA,MySQL三个依赖 对于已存在的项目可以在bulid.gradle加入,spring b ...
- 厉害了,龙果!开源中国颁发了证书:GVP-码云最有价值开源项目
roncoo-pay (龙果支付系统) roncoo-pay是国内首款开源的互联网支付系统,其核心目标是汇聚所有主流支付渠道,打造一款轻量.便捷.易用,且集支付.资金对账.资金清结算于一体的支付系统, ...
- 关于JS中变量提升的规则和原理的一点理解
关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...
- Redis4.0 Cluster — Centos7
本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.基础安装 wget http://download.redis.io/releases/ ...