基于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将一个请求的处理过程分解为一系列的阶段,阶段之间通过事件队列联系,开发人员只负责每个阶段的服务逻辑以及阶段间的连接逻辑,而由各个阶段自身负责资源管理以及负载适应功能。使用这种解耦拆分可以使系统达到高并发性、对负载变化的良好适应性以及高度的可缩放性。
参考资料:
[1] Michael Eckert and Fran¸cois Bry.Complex Event Processing (CEP) [R].德国:Institut f¨ur Informatik, Ludwig-Maximilians-Universit at Munchen,2009.
[2] Matt Welsh.The Staged Event-Driven Architecture for Highly-Concurrent Server Applications [R].美国:University of California, Berkeley,2005.
[3] Rob Von Behren,Jeremy Condit,George C. Necula etc. Scalable Threads for Internet Services[R].美国:University of California, Berkeley,2004
相关推荐
**基于SEDA的异步框架设计与实现** SEDA(Staged Event-Driven Architecture)是一种软件架构模式,常用于高性能、高并发的应用程序设计。它将系统分解为多个独立的阶段,每个阶段处理特定类型的事件,并通过队列...
SEDA的核心思想是将服务分解为多个独立的阶段,并在这些阶段之间使用队列作为缓冲。这样做的好处包括: 1. **准入控制策略**:队列可以实施准入控制,防止过载,确保服务质量。 2. **明确的执行边界**:队列引入了...
1. **分阶段处理**:SEDA模型将ESB内部的工作流程划分为多个阶段,每个阶段都专注于执行特定的任务,如消息接收、解析、路由和转发等。这种方式可以避免单个处理单元过载,提高整体处理效率。 2. **异步事件驱动**...
**SEDA(Staged Event Driven Architecture)框架详解** SEDA,全称为Staged Event Driven Architecture,是一种在高性能计算领域被广泛采用的软件架构模式,最初由加州大学伯克利分校的研究团队提出。该架构设计的...
7.使用基于SEDA处理模型的高度可伸缩的企业服务器. 8.强大的基于EIP模式的事件路由机制等. Mule发布最新版本1.1,这个发布包括集成了JBI,对 BPEL的支持,还增加一些新的传输器(transport)Quartz,FTP,RMI与EJB等。
7. 使用基于 SEDA 处理模型的高度可伸缩的企业服务器。 8. 强大的基于 EIP 模式的事件路由机制等。 Mule ESB 的整体结构图: Mule 通过 Transports/Connectors 与外围的异构系统连接,提供 Routing(路由)、...
唤醒Wake是一个事件驱动的框架,基于SEDA,Click,Akka和Rx的思想。 从某种意义上说,它是通用的,旨在支持计算密集型应用程序以及高性能网络,存储和旧版I / O系统。 我们实现了Wake以支持高性能,可扩展的分析处理...
Mule Enterprise Service Bus(ESB)是一种先进的开源框架,专为现代企业的集成需求设计。Mule ESB的核心价值在于其强大的连接性和灵活性,使企业能够轻松整合多种应用和服务,无论它们的基础技术如何。该框架的主要...
Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于快速开发可维护的高性能协议服务器与客户端。该框架利用Java NIO来实现Reactor模式,这种模式通过同步等待多个I/O事件的发生,然后通过多路复用机制将...
JBI 是一种面向服务的框架,支持消息传递(同步、异步、点对点、发布-订阅),包含基于标准的适配器,用于集成传统系统。JBI 是 Java 领域的 ESB 规范,它提供了一个通用的接口,用于集成多个异构系统,实现系统之间...
Mule是一个企业服务总线(ESB)消息框架,它为集成不同系统和应用程序提供了一种轻量级的、易于使用的方法。Mule的设计哲学围绕着灵活性和可扩展性,通过其高度可插拔的架构,支持多种传输协议和数据格式,使得...
将 SEDA 与 Spring Boot 结合使用,可以更好地实现微服务间的异步通信。 - **RESTful 接口设计**:Spring Boot 提供了简洁的方式来实现 RESTful API,结合 SEDA 架构可以更好地支持微服务之间的交互。 - **安全性...
例如,SEDA (Staged Event-driven Architecture) 就是一种典型的混合型架构,它通过将系统划分为多个阶段,并在每个阶段内部采用适当的并发策略,从而达到既提高并发性又保证可维护性的目的。 4. **自定义并发框架*...
如基于J2EE 1.4的企业消息总线(Enterprise Service Bus (ESB))和消息代理(broker)、可插入性连接、支持任何传输之上的异步、同步和请求响应事件处理机制、支持Axis或Glue的Web Service、灵活的部署结构、支持...
1. **异步与非阻塞**:MINA 使用 NIO 技术实现非阻塞 I/O 操作,这使得它可以同时处理多个客户端连接而不被单个操作所阻塞。 2. **事件驱动**:MINA 的设计基于事件模型,当特定的 I/O 事件发生时(如数据可读或可写...
在SEDA架构中,不同的处理阶段可以通过不同的通道(如TCP、HTTP、MQ通道)进行交互,利用消息框架如Java内存队列或外部持久化队列进行通信。Spring Integration提供了如DirectChannel、PollableChannel、...