Closed Linkyx closed 1 year ago
测试发现:
对此,可以优化如下:
var mapRb map[string]*builder.RuleBuilder
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时并没有用上,不知道后续会不会优化这部分
感谢回答; 不过这里的问题主要在第一次调用BuildRuleFromString进行初始化的时候,规则过多的话,不可避免需要等待所有规则的构建时长,实测这个时间会线性增长,当重新部署拥有大量规则的服务,等待服务就绪的时间过长;
程序启动时先将所有规则调用BuildRuleFromString进行初始化(只执行一次BuildRuleFromString)
这个在实际生产环境应用时有优化经验吗?
实际生产环境这种就是各路大神各显神通啦,要是规则过多,并且电脑也是多核的,可以起多个协程(线程)来同时进行BuildRuleFromString,比如:
最后:gengine引擎感觉现在没人维护了,提问题没人回复了的,条件够的感觉还是开发自己引擎靠谱一点,不过过渡学习一下还是不错的
多谢回答!
举个例子:生成环境部署规则服务的话,规则本身存储在db,规则服务启动的时候需要从db加载规则并调用runBuilder.BuildRuleFromString进行初始化,但是规则量级过大的情况下,这一步非常耗时; 请问有没其他推荐做法?