bilibili / gengine

Other
1.95k stars 272 forks source link

生产环境中runBuilder.BuildRuleFromString 初始化时,构建的规则量级较大耗时比较高,这种情况下有处理建议么? #63

Closed Linkyx closed 1 year ago

Linkyx commented 1 year ago

举个例子:生成环境部署规则服务的话,规则本身存储在db,规则服务启动的时候需要从db加载规则并调用runBuilder.BuildRuleFromString进行初始化,但是规则量级过大的情况下,这一步非常耗时; 请问有没其他推荐做法?

Little-Timo commented 1 year ago

测试发现:

对此,可以优化如下:

func init(){ // 其他操作... rb := builder.NewRuleBuilder(nil) err := rb.BuildRuleFromString(your_rule) if err == nil { mapRb["xxxx"] = rb } // 其他操作... }

- 实际执行时,new一个新 rb_,然后找到ruleBuilder池对应的rb,将rb.Kc赋给新的 rb_,如:
```go
dc_ := context.NewDataContext()
rb_ := builder.NewRuleBuilder(dc_)
rb = mapRb["xxxx"]
rb_.Kc = rb.Kc

那么此时rb_就是一个新的ruleBuilder,省去了再执行一次BuildRuleFromString

其实NewRuleBuilder时传的参数Dc,在BuildRuleFromString时并没有用上,不知道后续会不会优化这部分

Linkyx commented 1 year ago

感谢回答; 不过这里的问题主要在第一次调用BuildRuleFromString进行初始化的时候,规则过多的话,不可避免需要等待所有规则的构建时长,实测这个时间会线性增长,当重新部署拥有大量规则的服务,等待服务就绪的时间过长;

程序启动时先将所有规则调用BuildRuleFromString进行初始化(只执行一次BuildRuleFromString)

这个在实际生产环境应用时有优化经验吗?

Little-Timo commented 1 year ago

实际生产环境这种就是各路大神各显神通啦,要是规则过多,并且电脑也是多核的,可以起多个协程(线程)来同时进行BuildRuleFromString,比如:

最后:gengine引擎感觉现在没人维护了,提问题没人回复了的,条件够的感觉还是开发自己引擎靠谱一点,不过过渡学习一下还是不错的

Linkyx commented 1 year ago

多谢回答!