有人了解SEDA这个服务器模型吗?

136 views
Skip to first unread message

zhongqing zhang

unread,
Feb 20, 2006, 10:09:51 PM2/20/06
to dev4s...@googlegroups.com
好像是阶段式服务器模型,

sunway

unread,
Feb 20, 2006, 10:11:05 PM2/20/06
to 高性能网络编程邮件列表
SEDA?
有资料提供给大家 看看么?

Roger Chen

unread,
Feb 20, 2006, 10:21:50 PM2/20/06
to dev4s...@googlegroups.com
我对它的认识是 SEDA == 队列,似乎是非常简单的应用。当然,文献是一堆一堆
的:)

Arbow研究过SEDA,可以谈谈看法。

--
Roger Chen <che...@gmail.com>

Donald

unread,
Feb 21, 2006, 1:13:57 AM2/21/06
to dev4s...@googlegroups.com
分段式的事件驱动框架,我只看过它的nbio


在 06-2-21,Roger Chen<che...@gmail.com> 写道:


--
Donald

Arbow

unread,
Feb 21, 2006, 4:42:15 AM2/21/06
to 高性能网络编程邮件列表
To all:


我的认识也不深啊,那时候在研究OceanStore的时候分析了下源码。它里面的所有组成都基于Stage,包括网络层NBIO部分。Stage含一个队列和一个线程池,各个Stage间通过Message类传递消息。感觉方便和复杂的就在于Stage的配置部分,可以通过一个配置文件灵活设置要启动那些Stages。不说了,快忘光了,就记得这些:(

----
Arbow avi...@gmail.com

anders lin

unread,
Feb 21, 2006, 8:02:23 AM2/21/06
to dev4s...@googlegroups.com
通过分阶段分发消息来提高保证效率。 著名的ESB项目servicemix就用到它了!

sunway

unread,
Feb 21, 2006, 8:45:04 AM2/21/06
to 高性能网络编程邮件列表
如何分阶段发送消息?

anders lin

unread,
Feb 21, 2006, 8:53:27 AM2/21/06
to dev4s...@googlegroups.com
见附件吧!

On 2/21/06, sunway <sunh...@gmail.com> wrote:
seda-sosp01.pdf
quals-seda.pdf

sunway

unread,
Feb 21, 2006, 10:26:52 AM2/21/06
to 高性能网络编程邮件列表
谢谢哈,我看看

zhuam

unread,
Feb 21, 2006, 8:35:34 PM2/21/06
to 高性能网络编程邮件列表
呵呵,SEDA , 又是SEDA ,简单说说吧:

SEDA 主要是可以将应用的处理分成多个Stage ,一个Stage
有一个 Handler
,同时给每个Stage都可以配置一个自己的线程池来处理它的事件,能够精致调整其池的大小,这才是SEDA的精髓,看段代码吧:

import gov.lbl.dsd.sea.EventHandler;
import gov.lbl.dsd.sea.Stage;
import gov.lbl.dsd.sea.StageManager;
import gov.lbl.dsd.sea.event.IllegalEventException;

import java.util.Date;

import EDU.oswego.cs.dl.util.concurrent.CountDown;

/**
* Demonstrates how to use the framework with a very basic example. In
this
* example there are two stages. The first stage receives number events
that are
* incrementing over time. It prints the number, adds 1000 to it, and
hands the
* new number to the second stage, which also prints it.
*
* @author whos...@lbl.gov
* @author $Author: gegles $
* @version $Revision: 1.4 $, $Date: 2004/09/16 16:57:15 $
*/
public class StageDemo {

public static void main(String[] args) {
int runs = 3;
if (args.length > 0) runs = Integer.parseInt(args[0]);

final CountDown barrier = new CountDown(1); // a barrier to later
wait until all responses have arrived

// the event handler for the second stage
EventHandler h2 = new EventHandler() {
public void handle(Object event) {
System.out.println("handler2: " + event);
int val = ((Integer) event).intValue();
if (val == -1+1000) {
barrier.release();
}
}
};
StageManager manager = new StageManager();
final Stage s2 = manager.createStage(h2).start();

// the event handler for the first stage
EventHandler h1 = new EventHandler() {
public void handle(Object event) {
System.out.println("handler1: " + event);
if (! (event instanceof Integer)) throw new
IllegalEventException(event, this.getStage());

int val = ((Integer) event).intValue();
s2.enqueue(new Integer(val + 1000));
}
};
Stage s1 = manager.createStage(h1).start();

// enqueue some events to be handled immediately, and also later in
three secs
s1.enqueue(new Integer(100), new Date(System.currentTimeMillis() +
1));
s1.enqueue(new Integer(200), new Date(System.currentTimeMillis() +
3000));

//s1.enqueue("illegal dummy"); // uncomment this to experiment with
getting IllegalEventExceptions

// enqueue some more events to be handled ASAP
for (int i=0; i < runs; i++) {
s1.enqueue(new Integer(i));
}

/*
// uncomment to see the "three second" event being handled before
shutting down
try {
Thread.sleep(5000);
} catch (InterruptedException e) { e.printStackTrace(); }
*/

s1.enqueue(new Integer(-1)); // enqueue crude "termination signal"

// cleanly shut down all stages and threads
System.out.println("waiting for all events to run through
pipeline...");
try {
barrier.acquire();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("now shutting down...");
manager.stopAll();
}

}


Nux 比较好懂,看看应该就可以明白了。

New Nux release out, http://dsd.lbl.gov/nux/

Arbow

unread,
Feb 21, 2006, 9:16:21 PM2/21/06
to 高性能网络编程邮件列表
to all:

突然想起了google的MapReduce,感觉跟SEDA有点形似,如同一个分布式的SEDA。MapReduce里面的每台机器都相当于一个Stages,独立执行数据处理或汇总的任务,任务完成后通过网络传送数据给下一台机器。总体思想也是类似SEDA,利用多个独立的计算单元来实现总体效率最大化。

--
Arbow avi...@gmail.com

sunway

unread,
Feb 22, 2006, 2:47:42 AM2/22/06
to 高性能网络编程邮件列表
我大致看了下,看起来符合当前的趋势,充分利用超线程,多核CPU的能力。
但是问题是如何划分阶段?
1。如果阶段颗粒太小,阶段间切换的次数就比较频繁。这样效率未必高。
2。如果多个阶段都要修改或者访问相同资源。同步这些操作的LOCK会大大降低分阶段的性能

alvi...@gmail.com

unread,
Feb 27, 2006, 10:35:26 AM2/27/06
to 高性能网络编程邮件列表
有点象ACE的Task模型

Donald

unread,
Feb 27, 2006, 9:06:13 PM2/27/06
to dev4s...@googlegroups.com
yeah,you are right!

2006/2/27, alvi...@gmail.com <alvi...@gmail.com>:
> 有点象ACE的Task模型
>
>
>


--
Donald
My Blog:http://flyingbug.blogjava.net

Dr.Water

unread,
Feb 27, 2006, 10:25:58 PM2/27/06
to 高性能网络编程邮件列表

sunway 写道:

> SEDA?
> 有资料提供给大家 看看么?


SEDA
java 实现主要有2块

1. SEDA 老大自己的实现。。。有点复杂 包括native的nio
老大都自己做了一个
nbio

2. SEA http://dsd.lbl.gov/sea/ 一个开源的SEDA 实现

其实关键是用了
concurrent包,不是jdk自己带的

而是这个里面的 EDU.oswego.cs.dl.util.concurrent

QueueExecutor,ThreadExecutor;PooledExecutor
作为每个Stage的线程处理池

然后网络部分他自己做了一个NetAgent
关心nio的可以仔细看看

alvi...@gmail.com

unread,
Feb 28, 2006, 3:44:42 AM2/28/06
to 高性能网络编程邮件列表
呵呵,又回到那个c++模型的问题上来了,很多流行的平台的东西,还都是从POSA这类理论里来的,除非他们推翻或者改进这些理论,我看搞商业的很难和那些搞学术研究的相并论。

Donald 写道:

sunway

unread,
Feb 28, 2006, 9:09:10 AM2/28/06
to 高性能网络编程邮件列表
你说的很多学术上的东西,比如ACE的一些实现,我在看到ACE之前就在正式的服务器上采用过比如线程池,TASK等等技术.很多学术上东西都是来源实际软件中的开发经验,而不是凭空空想出来的.

>>呵呵,又回到那个c++模型的问题上来了,很多流行的平台的东西,还都是从POSA这类理论里来的,除非他们推翻或者改进这>>些理论,我看搞商业的很难和那些搞学­术研究的相并论。

疾风之狼(Alvin.Lee)

unread,
Feb 28, 2006, 9:29:33 AM2/28/06
to 高性能网络编程邮件列表
是啊,他们都是搞大型系统上十年的经验。有试验室,有积极的学生,有工业上的需求,最终积累出来的。哪象国内...

sunway 写道:

> 你说的很多学术上的东西,比如ACE的一些实现,我在看到ACE之前就在正式的服务器上采用过比如线程池,TASK等等技术.很多学术上东西都是来源实际软件中的开发经验,而不是凭空空想出来的.
>
> >>呵呵,又回到那个c++模型的问题上来了,很多流行的平台的东西,还都是从POSA这类理论里来的,除非他们推翻或者改进这>>些理论,我看搞商业的很难和那些搞学-术研究的相并论。

sunway

unread,
Feb 28, 2006, 9:53:52 AM2/28/06
to 高性能网络编程邮件列表
嘿嘿,
最好不要拿国内来说事,国内现在的状况不太好,大家都有责任的.
现在大家看到了这种状况,这不sodme的group已经建好了.

Lee Alvin

unread,
Feb 28, 2006, 8:47:31 PM2/28/06
to dev4s...@googlegroups.com
看我们都能不能坚持上十年,关键是方向和深度。经验的积累也是巨大的财富啊,如果能够有些底层的创新那更好。关键人们都忙着生存,而不都是做自己感兴趣和想做的。

2006/2/28, sunway <sunh...@gmail.com>:

思航

unread,
Mar 1, 2006, 8:15:59 PM3/1/06
to 高性能网络编程邮件列表
采用分级事件驱动架构(SEDA)。SEDA(staged event driven
architecture)基于Staged的事件驱动架构,就是把系统分成若干个Stage,每个Stage负责一部分功能;
stage间以Event来通讯,通过对Event队列的控制来达到调整系统性能的目的。

SEDA:新的软件体系架构
 SEDA = staged event driven architecture
by Matt D. Welsh, CS, UC Berkeley
 Staged:
将系统分为若干的阶段,每一阶段是一个模块,有明显的功能独立性
 Event:
模块间进行通讯的手段,包罗万象,任何模块间需要传递的内容都可以用Event来表示
SEDA的先进性——传统架构
 传统的软件架构:多线程,通常是为某一个任务(如TCP连接)单独分配一个连接
 当线程数达到一定的数量的时候由于在线程之间不断切换,系统的额外开销增大,效率明显下降
 作为一个responsive, robust, and always
available的系统,这样远远达不到要求
SEDA的先进性——传统架构的改进
 一些系统的解决方案
 Apache &
IIS——限制连接的数目,以达到限制系统内的线程数量的目的
 效果:系统高throughput,保持高效率,但是忽略了公平性
SEDA的先进性—Thread Server Throughput Degradation
SEDA的先进性
 我们的目标:系统的吞吐量在未达到饱和时随着并发度的增加而增大,一旦达到饱和,吞吐量将几乎维持恒定。而在达到饱和后所有用户的反应时间应是公平的随着用户的增多线性增长。
SEDA的先进性—Event-driven Server Throughput Degradation
SEDA的先进性
 SEDA采用非阻塞IO,将系统划分成几个stage,stage间以Event来通讯,通过对Event队列的控制来达到调整系统性能的目的
 SEDA将系统依据功能分为几个不同的阶段,每个阶段由自己独立的运行参数,系统瓶颈很容易被定位
SEDA的结构
 系统 = stage + stage +…+ stage
 Stage通过Event互相通讯
 Event是装在Event
Queue中的,每个stage都可以向其他的某些stage enqueue
event。
 Stage采取某种策略从Event Queue中取出Event进行处理
SEDA的结构——一个stage
SEDA的结构——一个http sever
燕星2.0的路由——Emergint
 燕星系统内每个存储的对象都有一个8个十六进制位的OID,每个节点都有一个6个十六进制位的NID。对象由与其前缀相同的节点进行存储
 系统内的对象的定位与路由都通过Emergint来实现
Emergint的大致思想
 某节点定位一个对象,就是要找到具有与该对象OID前六位相同的NID的节点
 每转发匹配一位,每个节点都有length(NID)级邻居,节点根据消息已转发的步数寻找邻居节点再转发

思航

unread,
Mar 1, 2006, 8:23:25 PM3/1/06
to 高性能网络编程邮件列表
java开源的mule,基于seda架构,有兴趣的可以研究一下

Lee Alvin

unread,
Mar 2, 2006, 4:01:41 AM3/2/06
to dev4s...@googlegroups.com
不错 ,这个Event应该象ACE里的Task中MessageQuene的ACE_Message_Block。然后Task可以包装成Module,然后插入到Stream框架里,最后Stream框架和Module与Task可以用Service框架来调配。

2006/3/2, 思航 < hongli...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages