【问题标题】:Externalizing and Caching drools due to heavy memory consumption由于大量内存消耗,外部化和缓存流口水
【发布时间】:2019-12-27 15:12:04
【问题描述】:

当我刚接触 drools 时,我浏览了一些论坛并开发了一个应用程序,其中包含使用 KnowledgeBuilder api 和 StatefulKnowledgeSessions 配置的 drools。当时的drools文件数量较少,并且与应用程序一起打包。 在进行分析时,我发现口水消耗了大量内存并且内存分配率(TLAB)很高。这让我想到是否需要有一个缓存解决方案,以便在每次有应用程序请求时不创建 KnowledgeSessions。 我的应用程序支持几乎 100 多种类型的事件,并且对于每个事件,我都有 3 种不同类型的 drools 文件,我一次执行一个以在中间过滤结果。 此外,应用程序中的 drools 文件数量和更改/配置新的频率正在增加,我必须从应用程序包中外部化 drools。 我有不同的 drools 文件来满足不同的需求,并不是每次都需要,所以我想保持一个 REST 服务备份一个 NO-SQL 数据库,只要我们想要更改,这些数据库就会被注入其中。 因此,我认为应用程序可以从服务中获取唯一需要/必需的流口水文件(我将有流口水文件的命名约定),如果需要在本地缓存它们(将使用 Guava 缓存/任何 Inprocess 缓存来驱逐因此,如果不需要),因此内存消耗/分配率可能会下降(猜测) 我对上述设计是否正确?如果这样如何从缓存/字符串构建器/内存中读取流口水? 目前我通过下面的 api 从文件系统中读取它们

KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
knowledgeBuilder.add(ResourceFactory.newClassPathResource("drools_conventions.drl"), ResourceType.DRL);
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
StatefulKnowledgeSession kSession = knowledgeBase.newStatefulKnowledgeSession();
List filter = new ArrayList<>();
kSession.insert(dispatchFactInput);
kSession.setGlobal("Rule", filter);
kSession.fireAllRules();
kSession.dispose(); ```

Can I cache Knowledgebase/StatefulKnowledgeSession?

Since I am new to drools I would like to take opinions/suggestions, learn to implement the best/possible solution to above situation.

【问题讨论】:

    标签: caching drools externalizing


    【解决方案1】:

    我想你可以看看stateless sessions。我认为如果您只是插入事实、触发规则然后立即处理 KieSession,那是您的最佳选择。除此之外,在较新的 Drools 版本中已经有 caching mechanism 的会话可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2012-11-14
      • 2022-01-16
      • 2014-01-04
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多