我的认识也不深啊,那时候在研究OceanStore的时候分析了下源码。它里面的所有组成都基于Stage,包括网络层NBIO部分。Stage含一个队列和一个线程池,各个Stage间通过Message类传递消息。感觉方便和复杂的就在于Stage的配置部分,可以通过一个配置文件灵活设置要启动那些Stages。不说了,快忘光了,就记得这些:(
----
Arbow avi...@gmail.com
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/
突然想起了google的MapReduce,感觉跟SEDA有点形似,如同一个分布式的SEDA。MapReduce里面的每台机器都相当于一个Stages,独立执行数据处理或汇总的任务,任务完成后通过网络传送数据给下一台机器。总体思想也是类似SEDA,利用多个独立的计算单元来实现总体效率最大化。
--
Arbow avi...@gmail.com
2006/2/27, alvi...@gmail.com <alvi...@gmail.com>:
> 有点象ACE的Task模型
>
>
>
--
Donald
My Blog:http://flyingbug.blogjava.net
> 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的可以仔细看看
Donald 写道:
>>呵呵,又回到那个c++模型的问题上来了,很多流行的平台的东西,还都是从POSA这类理论里来的,除非他们推翻或者改进这>>些理论,我看搞商业的很难和那些搞学术研究的相并论。
sunway 写道:
> 你说的很多学术上的东西,比如ACE的一些实现,我在看到ACE之前就在正式的服务器上采用过比如线程池,TASK等等技术.很多学术上东西都是来源实际软件中的开发经验,而不是凭空空想出来的.
>
> >>呵呵,又回到那个c++模型的问题上来了,很多流行的平台的东西,还都是从POSA这类理论里来的,除非他们推翻或者改进这>>些理论,我看搞商业的很难和那些搞学-术研究的相并论。
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)级邻居,节点根据消息已转发的步数寻找邻居节点再转发
My Blog: http://wolf.bloghome.cn