基于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将一个请求的处理过程分解为一系列的阶段,阶段之间通过事件队列联系,开发人员只负责每个阶段的服务逻辑以及阶段间的连接逻辑,而由各个阶段自身负责资源管理以及负载适应功能。使用这种解耦拆分可以使系统达到高并发性、对负载变化的良好适应性以及高度的可缩放性。

时间: 2024-10-12 16:42:37

基于SEDA的异步框架设计与实现的相关文章

Java EE 架构设计——基于okhttp3 的网络框架设计

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/77893903 本篇文章带大家设计一套满意业务需求.代码健壮高效(高内聚低耦合)并且可拓展的网络框架.以最新的okhttp3为基础设计出高效可靠的网络缓存.多线程文件下载等架构模块.从此不局限于使用别人的框架,而步入了设计框架,让自己可以走的更远,我觉得这才是一名合格开发者所应该具备的能力.在开发中,选择一个开源框架的标准有很多,例如学习成本.文档是否齐全.github星数量.现在

twisted是python实现的基于事件驱动的异步网络通信构架。

网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? Twisted is an event-driven networking engine written in Python and licensed under the open source ?MIT license. Twisted runs on Python 2 and an ever g

Android通用框架设计与完整电商APP开发

第1章 课程介绍及APP效果展示(Java版)本章概述了本课程大家能学到什么,老师如何讲解,为什么这么讲解,并介绍了框架的整体架构设计与模块分解,最后展示了用自己设计的框架开发出来的完整电商APP的效果图(服务端API快速搭建教程:http://www.imooc.com/article/19001) ...1-1 课程导学1-2 项目架构设计与模块分解 第2章 项目初始化本章将从零搭建一个空项目,实践项目搭建的过程,并额外教大家搭建一个基于Go语言的Web版Git服务器,实现代码托管的自举.(

JS读书笔记:《JavaScript框架设计》——第12章 异步处理

一.何为异步   执行任务的过程可以被分为发起和执行两个部分. 同步执行模式:任务发起后必须等待直到任务执行完成并返回结果后,才会执行下一个任务. 异步执行模式:任务发起后不等待任务执行完成,而是马上执行下一个任务,当任务执行完成时则会收到通知. 面对IO操作频繁的场景,异步执行模式可在同等的硬件资源条件下提供更大的并发处理能力,也就是更大的吞吐量. 但由于异步执行模式打破人们固有的思维方式,并且任务的发起和任务的执行是分离的,从而提高编程的复杂度. 多线程.多进程均可实现异步模式. 二.从回调

基于Extjs的web表单设计器 第六节——界面框架设计

基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计 基于Extjs的web表单设计器 第七节——取数公式设计 基于Extjs的web表单设计器 第八节——表单引擎设计 这一节我给大家介绍一下表单设

Android异步框架RxJava 1.x系列(一) - 观察者模式及实现

Android异步框架RxJava 1.x系列(一) - 观察者模式及实现 前言 RxJava 是一款基于 Java VM 实现的响应式编程扩展库 - 基于观察者模式的异步和事件处理框架.RxJava 官方目前同时维护了两个版本,分别是 1.x 和 2.x,区别是它们使用不同的 group id 和 namespaces. 版本 group id namespaces v1.x io.reactivex io.reactivex v2.x io.reactivex.rxjava2 rx 本系列的

WisDom.Net 框架设计(七) 验证框架

WisDom.Net-验证框架 1.分类 这里我们将数据验证分为以下几种 数据类型校验      主要用于确保数据类型输入的正确  比如年龄一项输入 A岁 ,显然不合法 域检查               主要用于验证输入的数据的是否在取值范围  比如在年龄一项 输入 400 ,显然这里不合法 格式检查            主要用于检查数据格式是否正确, 比如Email 输入Ca 显然这里也是不合法 自定义检查,       自定义校验数据. 比如 校验数据格式是否合法等 2.简介      

MSDN搬运 之 [基于事件的异步模式]

基于事件的异步模式概述 那些同时执行多项任务.但仍能响应用户交互的应用程序通常需要实施一种使用多线程的设计方案.System.Threading 命名空间提供了创建高性能多线程应用程序所必需的所有工具,但要想有效地使用这些工具,需要有丰富的使用多线程软件工程的经验.对于相对简单的多线程应用程序,BackgroundWorker 组件提供了一个简单的解决方案.对于更复杂的异步应用程序,请考虑实现一个符合基于事件的异步模式的类. 基于事件的异步模式具有多线程应用程序的优点,同时隐匿了多线程设计中固有

JavaScript异步编程设计快速响应的网络应用

JavaScript已然成为了多媒体.多任务.多内核网络世界中的一种单线程语言.其利用事件模型处理异步触发任务的行为成就了JavaScript作为开发语言的利器.如何深入理解和掌握JavaScript异步编程变得尤为重要!!!<JavaScript异步编程设计快速响应的网络应用>提供了一些方法和灵感. 一.深入理解JavaScript事件 1. 事件的调度 JavaScript事件处理器在线程空闲之前不会运行(空闲时运行). var start = new Date(); setTimeout