基于SEDA的异步框架设计与实现
基于SEDA的异步框架设计与实现
二、为什么使用SEDA
目前,面对并发环境,主流互联网服务器编程模型有两种:多线程模型以及事件驱动模型。但是这两个模型都不足以解决这个问题。我们来首先看一下这两种编程模型。
1、多线程并发模型
多线程并发模型是目前最普遍的服务器编程模型,该模型的架构如下图所示:
该模型针对每一个请求,会为其创建并分配一个线程。该线程负责这个请求的处理。该模型的优点:执行粒度是整个完整的处理流程。处理逻辑清晰,容易开发。但与此同时缺点也很明显:如果处理过程中某一步骤出现长时间调用(例如网络通信、I/O磁盘读写等),则会阻塞后续的请求,造成资源的浪费。并且,当随着处理请求不断增加,导致并发执行的线程数量太多。过多的线程数量导致系统在线程调度和资源争用上的开销过大。引起系统性能急剧下降。导致系统处理能力下降。
2、事件驱动模型
同时,我们也能看到,很多系统也倾向于使用事件驱动模型,该模型的模型图如下图所示:
该模型的思想为:将处理流程分割成多个步骤,每一个步骤都实现为一个有限状态机(FSM),所有的处理请求会作为事件进入系统,由调度器负责传递给相应的状态机,状态机的处理结果也以事件的形式传给调度器,新的事件将再次被调度器转发给下一个状态机进行处理,直至处理完成。该模型的优点在于,由于将各个处理步骤独立实现,可以很容易的进行系统监测和调整。但是其缺点也不容忽视,即:由于Scheduler的设计和实现过于复杂,针对于不同的应用和系统的逻辑变更需要不同的实现,导致采用这一模型构建出的系统将十分庞大和难以控制。
综上所述,主流的多线程编程模型以及事件驱动编程模型虽然都各有其优势,但同时也都有其不可避免的缺陷,并不适合在高并发的环境下进行成熟系统的开发。所以这就是为什么我们要选择其他的模式来进行系统开发。以下介绍SEDA架构思想。
3、阶段性事件驱动(SEDA)模型
针对上述现有主流并发架构之缺陷,若能够实现一种良好支持高并发,并且能够对性能需求自适应的架构,则将在很大程度上优化和提升服务器性能,既能够提高运行速度,又可以减少服务器压力,实现了公司利益与用户体验的双赢。因此,为汲取多线程与事件驱动模型之优点,最大程度规避这两者之缺点,以实现较好的高并发服务器架构,SEDA便应运而生。
SEDA(Staged Event Driven Architecture)是一种阶段性事件驱动的服务器应用程序架构。它是Matt Welsh博士于加州大学伯克利分校提出的一个高性能应用服务器模型。SEDA架构整合了多线程的服务器模型和事件驱动的服务器模型的优势,它可以高效地管理和控制服务器资源,良好地适应高并发环境,SEDA被设计成一个可伸缩的高可用服务器架构。
应用服务器之请求处理步骤通常是复杂的、基于事件驱动处理的有穷状态机(FSM),所以实现服务器程序过程就类似用程序实现有穷状态机过程。下图所示的即是一基于SEDA模型http服务器有穷机状态图:
SEDA架构能对有穷状态机进行分析,尔后将相关状态聚集在同一Stage中,Stage间采用队列的方式来进行通信。每一个Stage皆完全独立,均拥有自己的线程池,以及为了专门处理到达这一步骤所必须进行的工作。所有的Stage均通过自身事件队列连接在一起,构成完整的请求处理网络。性能控制器和动态线程池依请求的繁忙程度动态来调整线程池的大小,以达到系统资源的最有分配。每一个Stage由下述四部分组成:
(1) 事件队列:用以维持Stage间之通信。
(2) 事件处理器:用以执行请求到这一个Stage中所应执行的工作。
(3) 线程池:用以提供事件处理器且可以并发执行事件处理之环境。
(4) 性能控制器:用以对该Stage资源(线程数、队列长度等等)进行调整。
通过这四部分的协作配合,每一个Stage都可以很好地运行,并且可以控制资源的使用。已经过Stage处理完,若没有后续工作,即可以回收线程池中的线程,来供给其他Stage使用。Stage结构如下图所示。
在SEDA架构中,基本的处理单元称为阶段(Stage),一个阶段由事件队列、动态线程池、事件处理器和一个性能控制器四个组件构成。SEDA将一个请求的处理过程分解为一系列的阶段,阶段之间通过事件队列联系,开发人员只负责每个阶段的服务逻辑以及阶段间的连接逻辑,而由各个阶段自身负责资源管理以及负载适应功能。使用这种解耦拆分可以使系统达到高并发性、对负载变化的良好适应性以及高度的可缩放性。
基于SEDA的异步框架设计与实现的更多相关文章
- 基于cocos2d-x的游戏框架设计——李成
视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...
- 基于python的接口测试框架设计(三)接口测试的框架
基于python的接口测试框架设计(三)接口测试的框架 其实我这里用到的是unittest单元测试框架,,这个框架好就好在比较清楚,,setup terdown都可以处理一些初始化及完成后的工作 主要 ...
- 基于python的接口测试框架设计(二)配置一些参数及文件
基于python的接口测试框架设计(二)配置一些参数及文件 我这里需要基于我的项目配置的主要是登陆参数.以及baseURL ,把这些放在单独的文件里 毕竟导入的时候方便了一些 首先是url 图略 建 ...
- 基于python的接口测试框架设计(一)连接数据库
基于python的接口测试框架设计(一)连接数据库 首先是连接数据库的操作,最好是单独写在一个模块里, 然后便于方便的调用,基于把connection连接放在__init__()方法里 然后分别定义D ...
- 基于FPGA的异步FIFO设计
今天要介绍的异步FIFO,可以有不同的读写时钟,即不同的时钟域.由于异步FIFO没有外部地址端口,因此内部采用读写指针并顺序读写,即先写进FIFO的数据先读取(简称先进先出).这里的读写指针是异步的, ...
- twisted是python实现的基于事件驱动的异步网络通信构架。
网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...
- JS读书心得:《JavaScript框架设计》——第12章 异步处理
一.何为异步 执行任务的过程可以被分为发起和执行两个部分. 同步执行模式:任务发起后必须等待直到任务执行完成并返回结果后,才会执行下一个任务. 异步执行模式:任务发起后不等待任务执行完成,而是马上 ...
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于特定领域国土GIS应用框架设计及应用
基于特定领域国土GIS应用框架 设计及应用 何仕国 2012年8月16日 摘要: 本文首先讲述了什么是框架和特定领域框架,以及与国土GIS 这个特定领 ...
随机推荐
- Visual SVN IIS反向代理设置
需要解决的问题: 1. 设置反向代理 2. 解决部分后缀文件无法提交的问题 1. 设置反向代理 接收所有的URL 允许所有的HTTP_HOST 跳转到被代理的服务器 2. 允许所有后缀的文件访问IIS ...
- sql server Cannot resolve the collation conflict between "Chinese_PRC_BIN" and "Chinese_PRC_CI_AS" in the equal to operation
今天查询二个db,出现这个错误,二种方法,一种是把db里的collation改成一样的:如果不方便可以直接在sql语句后面转一下: select * from table where crm_mscr ...
- UIButton Making the hit area larger
http://stackoverflow.com/questions/808503/uibutton-making-the-hit-area-larger-than-the-default-hit-a ...
- kvc to nsdata
[NSKeyedArchiver archivedDataWithRootObject:arr]; [NSKeyedUnarchiver unarchiveObjectWithData: ...
- SQLite连接
SQLite -连接 SQLite的联接子句用于从数据库中的两个或多个表合并的记录.JOIN是用于通过使用共同的每个值从两个表结合域的装置. SQL定义了三个主要类型的连接: CROSS JOIN I ...
- 11gR2新特性---Gpnp守护进程
在这篇文章中,我们会对11gR2 新的守护进程(资源名称ora.gpnpd)进行介绍,其中包含的gpnp的功能,启动顺序和基本的诊断方法. gpnp全称为grid plug and play,该组件的 ...
- HTML5资源汇总(更新游戏引擎cocos2d-html5)
我也是现学现用,想了解的可以看看效果,想知道实现的也有源码 http://cocos2d-html5.org Cocos2d-HTML5 API和Cocos2d-x一致,同样的代码可以支持cocos2 ...
- python_108_格式化字符串format函数
#通过关键字映射 print('I am {name},age {age}'.format(name='qiqi齐',age=18))#I am qiqi齐,age 18 dictory={'name ...
- Hopfield 网络(上)
讲的什么 这部分主要对 Hopfield 网络作一大概的介绍.写了其模型结构.能量函数和网络的动作方式.主要参考了网上搜到的一些相关 PPT. 概述 早在 1982 年,Hopfield 发表的文 ...
- CentOS 6.6 安装nfs网络文件系统
http://www.linuxidc.com/Linux/2015-06/119370.htm ####搭建 http://blog.csdn.net/liumiaocn/article/det ...