什么是SEDA(分阶段事件驱动架构)?

SED*_*EDA 28 architecture stage event-driven eda

SEDA:用于良好可扩展的互联网服务的架构

"SEDA为的缩写阶段式服务器模型,并分解一个复杂的,事件驱动的应用程序为一组的阶段由连接队列 ".

我知道这是一个架构,并且SEDA有很多实现(参见维基百科文章).什么是"舞台"?有人可以提供有关分阶段事件驱动架构的全面高级摘要,以及它与传统(未分级?)事件驱动架构的区别吗?

小智 16

舞台类似于"事件".为了简化这个想法,将SEDA视为在它们之间发送消息的一系列事件.

我认为,使用这种架构的一个原因是,您可以对逻辑进行分段并将其连接并解耦每个事件,主要用于具有低延迟要求的高性能服务.

如果使用Java TPE,则可以监视每个阶段的运行状况,吞吐量,错误,延迟,并快速找到性能瓶颈的位置.并且作为一个很好的副作用,使用较小的代码片段,您可以轻松地测试它们并增加代码覆盖率(这是我的情况).

为了记录,这是Cassandra(NoSQL)和Mule ESB(AFAIK)的内部架构.

我建议阅读原始论文(抱歉,重复链接):

这是我为SEDA for Java EE建模的框架:http: //code.google.com/p/seide/

  • 现在已经打破了哈佛大学论文的链接.有人有副本吗? (2认同)

小智 11

线程架构与现实生活中的分阶段事件驱动架构:

想象一下,你有一家餐馆.现在,它将如何运作?

"线程架构":

  1. 客户到达
  2. 服务员(a)去找他/她
  3. 服务员(a)将他/她带到一张可用的桌子
  4. 服务员(a)接受订单
  5. 服务员(a)做饭
  6. 服务员(a)接受订购
  7. 服务员(a)等到客户完成他/她的餐费
  8. 服务员(a)走出客户端

在这种情况下,服务员在整个过程中与客户一起.如果服务器有10个线程,可以同时处理10个连接.

与SEDA:

  1. 客户到达
  2. 服务员(a)去找他/她
  3. 服务员(a)将他/她带到一张可用的桌子(然后回来给另一位客户来)
  4. 服务员(b)接受订单(大量I/O,需要时间)
  5. 库克做饭
  6. 服务员(c)接受订购
  7. 服务员(d)等到客户完成他/她的用餐付款
  8. 服务员(e)走出客户

在这种情况下,有不同类型的参与者在做这些活动.这有助于在活动中重复使用参与者,花费更少的时间并且结果更有效.事实上,这就是餐馆的工作方式(可能更多的服务员是同一个人,但厨师绝对不是).

这是一个极端的例子,当然对于线程服务器,可以完成一些异步任务.这只是一个理论上的例子.


spa*_*tik 5

文档可在github 上找到

文档中提到的 SEDA: “SEDA 中处理的基本单位是阶段。阶段是一个自包含的应用程序组件,由事件处理程序、传入事件队列和线程池组成......每个阶段都被管理通过影响调度和线程分配的控制器。阶段线程通过从传入事件队列中拉出一批事件并调用应用程序提供的事件处理程序来操作。事件处理程序处理每批事件,并通过以下方式分派零个或多个事件将它们排入其他阶段的事件队列中。”

对我来说,您可以将舞台设计为应用程序流程的逻辑模块化。它可以基于功能、基于关注点分离、基于性能、基于操作和维护。

我会请您阅读随附的 PDF,因为它提到需要一个事件队列来解耦东西,逻辑补偿以实现组件的最大效率,如何有效地重用应用程序在其上运行的现有资源,如网络、存储、 CPU周期等,

与之相似的是,有研究表明,流水线工人从头到尾进行串联组装,生产率较低,但是当他们被隔离并被迫完成一项工作并将部分组装的单元传递给下一组时,他们每个人都有效地管理他/她的工作。基本上,你的组装流程被分成多个阶段,每个阶段或一组阶段负责在一个阶段工作。

这里所做的一切都是围绕每个人或团体启用和建立一个框架,以及一种从一个人/团体到另一个人/团体的沟通模式。现在我们可以将每个人/组和围绕他的框架设置与一个阶段进行比较。

要在 SEDA 中添加事件维度,请考虑个人组如何相互通信以及涉及的事件数量。例如,第 1 阶段的人已经用完了完成他们的阶段的螺母和螺栓,他们立即通知订单部门经理有关螺母和螺栓的信息。订单部门经理有可能从另一个第 6 阶段的人那里得到了类似的要求,说螺母和螺栓已经用完了。现在,他在一个中心点看到请求(他就像 SEDA 中的控制器)和他拥有的所有条目的 excel 表,他保存了要下订单的请求(就像 SEDA 中的队列),他将它们组合起来并一次性将它们订购在一起,而不是发送两个订购请求(SEDA 中的线程和调度管理)。

现在,如果您的软件架构中有一个类似的机制,它有多个组件,相互发送各种事件,并让控制器使用它们并相应地采取行动,那么您可能已经有了一个非常好的分阶段事件驱动设置。