-
Notifications
You must be signed in to change notification settings - Fork 277
DAG模式
rencalo770 edited this page Apr 16, 2021
·
6 revisions
为了增加对任意可能执行模式的支持,以及为了让用户可以任意的编排规则的执行顺序, gengine支持DAG(Directed acyclic graph,有向无环图)执行模式. 此模式下,gengine不会考虑规则的具体优先级,而是基于用户构建的规则的有向无环图来并发或顺序地执行规则.
图存储结构主要有两种,邻接矩阵存储法和邻接链表法,其他存储方法,都是在这两者上优化而来。
邻接矩阵是表示顶点之间相邻关系的矩阵,具体如下
图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法
如果直接让用户直接构建以上两种DAG存储结构来执行规则,显然有点复杂.因此,为了用户可以更简单的构建自己的规则DAG, 我们在图的邻接矩阵上了做了一点小改进:将有向无环图抽象成"图层","图层"按列排布,从左至右,层内规则并发执行,层间规则顺序执行.
如下一张图有向无环图,总共有4层
用户仅需将同一层级的规则名放置于同一个切片中,然后将这些切片作为元素,依次从左至右,顺序放置于一个切片中,构成了一个基于规则名称的二维切片,然后调用gengine的相关API,gengine即可基于用户构建的DAG图来执行规则. 如上图中所示,规则引擎会先并发执行["rule1","rule2","rule3"],然后再并发执行["rule4","rule5","rule6","rule7"],然后再执行["rule8"],最后再并发执行["rule9","rule10","rule11"].
- gengine.go 中
func (g *Gengine) ExecuteDAGModel(rb *builder.RuleBuilder, dag [][]string) error
- gengine_pool.go 中
func (gp *GenginePool) ExecuteDAGModel(dag [][]string, data map[string]interface{}) (error, map[string]interface{})
- 测试: https://github.com/bilibili/gengine/blob/main/test/dag_test.go