repeatthink123yuchao commented on issue #5731: URL: https://github.com/apache/incubator-kie-drools/issues/5731#issuecomment-1970579156
> Regarding my suggestion 3. I strongly advice to give a look at how the [executable model](https://docs.drools.org/7.74.1.Final/drools-docs/html_single/index.html#executable-model-con_packaging-deploying) works. In essence if you precompile the rules with it instead of doing this from scratch at when the rules are loaded will improve your startup time between 10 and 100 times. Also if possible would be beneficial to try to split your single monolithic knowledge base in smaller ones. ############# drools source code ############# # org.kie.internal.builder.CompositeKnowledgeBuilder#add(org.kie.api.io.Resource) org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl#build ----org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl#getResources ----|->一个包对应一个 Resource , 封成 List<Resource> ----|->[fast] ----org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildResources ----|->List<Resource> 添加到 Stack<List<Resource>> ----|->[fast] ----org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildPackages --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#initPackageRegistries --------|->Collection<CompositePackageDescr> 包描述转包注册 Map<String, PackageRegistry> --------|->[fast] --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#normalizeTypeAnnotations --------|->[fast] --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildTypeDeclarations --------|->构建类型声明 --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildEntryPoints --------|->[fast] --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildOtherDeclarations --------|->[fast] --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#normalizeRuleAnnotations --------|->[fast] --------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildRules --------|->[slow] --------|->Slow Cause Analysis ------------1:遍历包/遍历每个包中规则,将drl文件转class并注册到 invoker ------------2: ------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileKnowledgePackages ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#validateUniqueRuleNames ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileFunctions ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileRules --------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileRules ------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#preProcessRules ------------------------|->清理此包的存量规则,为下一步做准备 ------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#sortRulesByDependency ------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileAllQueries ------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileRulesLevel ------------------------|-> 一个包中的规则数大于 parallelRulesBuildThreshold 时会 new ForkJoinPool() 并发编译 ----------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#initRuleDescr ----------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildRuleBuilderContext ----------------------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#addRule --------------------------------org.drools.compiler.rule.builder.RuleBuilder#build --------------------------------org.drools.compiler.rule.builder.RuleBuilder#buildAttributes --------------------------------org.drools.compiler.rule.builder.dialect.asm.AbstractASMConsequenceBuilder#build --------------------------------|->drl 生成 class code 并注册到 invoker ------------------------------------org.drools.compiler.rule.builder.dialect.java.JavaRuleBuilderHelper#registerInvokerBytecode ------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#wireAllRules ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#compileAll --------------------org.drools.compiler.compiler.PackageRegistry#compileAll ------------------------org.drools.compiler.compiler.DialectCompiletimeRegistry#compileAll ----------------------------org.drools.compiler.rule.builder.dialect.java.JavaDialect#compileAll --------------------------------org.drools.compiler.rule.builder.dialect.java.JavaDialect#dumpResources --------------------------------|->class对应的java写出到目录 --------------------------------|->org.drools.compiler.commons.jci.readers.MemoryResourceReader#resources 这个字段map型,key即规则名,value即规则的java文件 --------------------------------org.drools.compiler.commons.jci.compilers.JavaCompiler#compile(java.lang.String[], org.drools.compiler.commons.jci.readers.ResourceReader, org.drools.compiler.commons.jci.stores.ResourceStore, java.lang.ClassLoader) ------------------------------------org.drools.compiler.commons.jci.compilers.EclipseJavaCompiler#compile ------------------------------------|-> ------------------------------------org.eclipse.jdt.internal.compiler.Compiler#compile(org.eclipse.jdt.internal.compiler.env.ICompilationUnit[], boolean) ------------------------------------ ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#reloadAll ----------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#updateResults() ------------org.drools.compiler.builder.impl.KnowledgeBuilderImpl#processKieBaseTypes ------------ ------------ -------------------------------- ----org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildProcesses ----org.drools.compiler.builder.impl.KnowledgeBuilderImpl#buildOthers ---- ############# Our solution ############# 1 Split 80000 packages into 4 kie 2 At startup, each knowledge base is compiled by a single thread 3 Finally, start the thread to assemble the mapping between the package and the knowledge base -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
