-
Notifications
You must be signed in to change notification settings - Fork 278
NM执行模式
rencalo770 edited this page Feb 9, 2021
·
1 revision
- N-M执行模式, 将规则集中的规则基于优先级从高到底,依次排序,然后将规则集分成两阶段,第一阶段为前N个最高优先级的规则,第二个阶段为剩下的M个规则,即第一阶段的规则优先级一定比第二阶段的规则优先级高,由此产生了如下执行子模式
- 说明
执行模式 | 解释 |
---|---|
nSort - mConcurrent | 前n个规则顺序执行,执行完毕,并发执行剩下的m个规则 |
nConcurrent - mSort | 前n个规则并发执行,执行完毕,顺序执行剩下的m个规则 |
nConcurrent - mConcurrent | 前n个规则并发执行,执行完毕,并发执行剩下的m个规则 |
nSort - mSort | 前n个规则顺序执行,执行完毕,顺序执行剩下的m个规则;此模式退化为顺序执行模式,也就是普通的顺序模式 |
- 对应的API
API | 解释 |
---|---|
(g *Gengine) ExecuteNSortMConcurrent(nSort, mConcurrent int, rb *builder.RuleBuilder, b bool) error |
前n个规则顺序执行,执行完毕,并发执行剩下的m个规则;bool控制顺序执行阶段,有规则执行出错时,是否继续执行,true表示继续执行 |
(g *Gengine) ExecuteNConcurrentMSort(nConcurrent, mSort int, rb *builder.RuleBuilder, b bool) error |
前n个规则并发执行,执行完毕,顺序执行剩下的m个规则;bool控制并发执行完毕之后,有规则执行出错时,是否继续执行,true表示继续执行 |
(g *Gengine) ExecuteNConcurrentMConcurrent(nConcurrent, mConcurrent int, rb *builder.RuleBuilder, b bool) error |
前n个规则并发执行,执行完毕,并发执行剩下的m个规则;bool控制第一阶段并发执行完毕,有规则出错时,是否继续执行第二个并发阶段,true表示继续执行 |
- 注意事项:
- 参数 n 和 m 必须都大于0;
- 规则集中的规则个数必须大于等于 n+m; 当规则集中的规则个数大于n+m时, 对规则集的前n+m个规则执行N-M模式,剩下的规则被忽略.
- 详细的测试,请看: https://github.com/bilibili/gengine/blob/main/test/n_m_model_test.go
- 我们可以先从规则集中基于指定的规则名选出一批规则,然后再使用N-M模式执行,对应的API如下:
API | 解释 |
---|---|
(g *Gengine) ExecuteSelectedNSortMConcurrent(nSort, mConcurrent int, rb *builder.RuleBuilder, b bool, names []string) error |
基于指定的规则名称集合names,选出一批规则,前n个规则顺序执行,执行完毕,并发执行剩下的m个规则;bool控制顺序执行阶段,有规则执行出错时,是否继续执行,true表示继续执行 |
(g *Gengine) ExecuteSelectedNConcurrentMSort(nConcurrent, mSort int, rb *builder.RuleBuilder, b bool, names []string) error |
基于指定的规则名称集合names,选出一批规则,前n个规则并发执行,执行完毕,顺序执行剩下的m个规则;bool控制并发执行完毕之后,有规则执行出错时,是否继续执行,true表示继续执行 |
(g *Gengine) ExecuteSelectedNConcurrentMConcurrent(nConcurrent, mConcurrent int, rb *builder.RuleBuilder, b bool, names []string) error |
基于指定的规则名称集合names,选出一批规则,前n个规则并发执行,执行完毕,并发执行剩下的m个规则;bool控制第一阶段并发执行完毕,有规则出错时,是否继续执行第二个并发阶段,true表示继续执行 |
- 注意事项:
- 参数 n 和 m 必须都大于0;
- 选定的规则集中的规则个数必须等于 n+m;
- 指定的规则名称集中的所有名称对应的规则必须存在
- 详细的测试,请看: https://github.com/bilibili/gengine/blob/main/test/n_m_model_test.go
- API
API | 解释 |
---|---|
(gp *GenginePool) ExecuteNSortMConcurrent(nSort, mConcurrent int, rb *builder.RuleBuilder, b bool) (error, map[string]interface{}) |
前n个规则顺序执行,执行完毕,并发执行剩下的m个规则,bool控制顺序执行阶段,有规则执行出错时,是否继续执行,true表示继续执行 |
(gp *GenginePool) ExecuteNConcurrentMSort(nConcurrent, mSort int, rb *builder.RuleBuilder, b bool) (error, map[string]interface{}) |
前n个规则并发执行,执行完毕,顺序执行剩下的m个规则,bool控制并发执行完毕之后,有规则执行出错时,是否继续执行,true表示继续执行 |
(gp *GenginePool) ExecuteNConcurrentMConcurrent(nConcurrent, mConcurrent int, rb *builder.RuleBuilder, b bool) (error, map[string]interface{}) |
前n个规则并发执行,执行完毕,并发执行剩下的m个规则,bool控制第一阶段并发执行完毕,有规则出错时,是否继续执行第二个并发阶段,true表示继续执行 |
(gp *GenginePool) ExecuteSelectedNSortMConcurrent(nSort, mConcurrent int, rb *builder.RuleBuilder, b bool, names []string) (error, map[string]interface{}) |
基于指定的规则名称集合names,选出一批规则, 前n个规则顺序执行,执行完毕,并发执行剩下的m个规则,bool控制顺序执行阶段,有规则执行出错时,是否继续执行,true表示继续执行 |
(gp *GenginePool) ExecuteSelectedNConcurrentMSort(nConcurrent, mSort int, rb *builder.RuleBuilder, b bool, names []string) (error, map[string]interface{}) |
基于指定的规则名称集合names,选出一批规则,前n个规则并发执行,执行完毕,顺序执行剩下的m个规则,bool控制并发执行完毕之后,有规则执行出错时,是否继续执行,true表示继续执行 |
(gp *GenginePool) ExecuteSelectedNConcurrentMConcurrent(nConcurrent, mConcurrent int, rb *builder.RuleBuilder, b bool, names []string) (error, map[string]interface{}) |
基于指定的规则名称集合names,选出一批规则,前n个规则并发执行,执行完毕,并发执行剩下的m个规则,bool控制第一阶段并发执行完毕,有规则出错时,是否继续执行第二个并发阶段,true表示继续执行 |
其中 map[string]interface{}
是收集每个策略的返回值(如果策略有返回值,map中的key是策略的名称, value是具体的返回值)
-注意事项
- 参数 n 和 m 必须都大于0;
- 规则集中的规则个数必须大于等于 n+m;当规则集中的规则个数大于n+m时, 对规则集的前n+m个规则执行N-M模式,剩下的规则被忽略.
- 选定的规则集中的规则个数必须等于 n+m;
- 指定的规则名称集中的所有名称对应的规则必须存在;
- 详细的测试,请看: https://github.com/bilibili/gengine/blob/main/test/n_m_model_pool_test.go