毕业论文
您现在的位置: 框架 >> 框架市场 >> 正文 >> 正文

基于DAG的任务编排框架平台

来源:框架 时间:2022/5/7
怎样防治白癜风 http://m.39.net/pf/a_4603866.html
架构师(JiaGouX)我们都是架构师!架构未来,你来不来?

最近在做的工作比较需要一个支持任务编排工作流的框架或者平台,这里记录下实现上的一些思路。

任务编排工作流

任务编排是什么意思呢,顾名思义就是可以把"任务"这个原子单位按照自己的方式进行编排,任务之间可能互相依赖。复杂一点的编排之后就能形成一个workflow工作流了。我们希望这个工作流按照我们编排的方式去执行每个原子task任务。如下图所示,我们希望先并发运行TaskA和TaskC,TaskA执行完后串行运行TaskB,在并发等待TaskB和C都结束后运行TaskD,这样就完成了一个典型的任务编排工作流。

DAG有向无环图

首先我们了解图这个数据结构,每个元素称为顶点vertex,顶点之间的连线称为边edge。像我们画的这种带箭头关系的称为有向图,箭头关系之间能形成一个环的成为有环图,反之称为无环图。显然运用在我们任务编排工作流上,最合适的是DAG有向无环图。

我们在代码里怎么存储图呢,有两种数据结构:邻接矩阵和邻接表。

下图表示一个有向图的邻接矩阵,例如x-y的边,只需将Array[x][y]标识为1即可。

此外我们也可以使用邻接表来存储,这种存储方式较好地弥补了邻接矩阵浪费空间的缺点,但相对来说邻接矩阵能更快地判断连通性。

一般在代码实现上,我们会选择邻接矩阵,这样我们在判断两点之间是否有边更方便点。

一个任务编排框架

了解了DAG的基本知识后我们可以来简单实现一下。

了解JUC包的可能快速想到CompletableFuture,这个类对于多个并发线程有复杂关系耦合的场景是很适用的,如果是一次性任务,那么使用CompletableFuture完全没有问题。但是作为框架或者平台来说,我们还需要考虑存储节点状态、重试执行等逻辑,对于这些CompletableFuture是不能满足的。

我们需要更完整地考虑与设计这个框架。首先是存储结构,我们的Dag表示一整个图,Node表示各个顶点,每个顶点有其parents和children:

//DagpublicfinalclassDefaultDagT,RimplementsDagT,R{privateMapT,NodeT,Rnodes=newHashMapT,NodeT,R();...}//NodepublicfinalclassNodeT,R{/***in

转载请注明:http://www.0431gb208.com/sjszlff/185.html