WorkStream设计思想

 

场景

我们需要构建一个人物信息的数据库,数据来源是wikipedia,人物筛选条件是 1961年出生,我们把这个任务交给一个程序员去做,规定他的输入是URL(http://en.wikipedia.org/wiki/Category:1961_births),输出是最终的人物信息数据库。

建模

clip_image002

从上图可以看出整个的处理过程可以抽象成数据流在节点之间的流动,数据流到达一个节点之后,处理节点对该数据进行逻辑处理并生成新的数据流节点。

抽象

就上述数据流处理过程进一步抽象便得到WorkStream的设计思想。

数据流处理网络是一张有向无环图(DAG),图中的节点是数据流处理节点,边表示数据流的流动方向,箭尾关联的数据流处理节点是此边关联数据流的产生着,箭头关联的数据流处理节点是该边关联数据流的处理者。

设计

clip_image004

WorkStream的类结构如上图所示;

设计的主要挑战有以下几点:

1. 数据流处理节点要实现并发。

2. 通过继承,组装可以组合成任意的DAG。

3. 对DAG中的以下数据要可以实时监控:

a) 当前缓存在内存中的数据流节点数量/占用内存。

b) 每个数据流处理节点的类型(入大于出还是出大于入)。

c) 每个数据流处理节点其待处理队列的大小。

4. 可以控制DAG系统占用内存上限,达到上限能够把属于出大于入类型的数据流处理节点暂停,一旦内存占用小于上限,则激活被暂停掉的数据流处理节点。

5. 可以安全停止DAG系统,保证所有数据流处理干净再退出(安全退出)。

6. 要有统一的数据流节点分发接口,即在每个数据流处理节点中不需要显式指定产生的数据流的流向,可以调用某统一的接口实现数据流的分发。

SVN

http://workstream.googlecode.com/svn/trunk/

使用

假设有下图所示的DAG:

clip_image006

构建该引用的类结构如下所示:

clip_image008

组装的代码如下:

clip_image010

A的代码如下所示:

clip_image012

Da如下所示:

clip_image014

备注

如果想要深入研究其实现细节,可以参考SVN上的源代码,也欢迎和我交流

Email:zhou518zhou@gmail.com

2012-10-03

posted on 2012-10-03 20:00  Razzit  阅读(1148)  评论(1编辑  收藏  举报

导航