gpt4 book ai didi

java - Drools 单例 StatefulKnowledgeSession 作为 Web 服务

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:24 25 4
gpt4 key购买 nike

我正在使用 Drools 5.6.0,我准备升级到 6.0,所以这个问题与两个版本都相关。

我在 google 上搜索了很多有关在多线程 环境中使用 Drools 的信息,但我仍然不确定如何继续。在以下场景中,我试图找到一种方法来使用使用大量静态事实预初始化的单例 StatefulKnowledgeSession 作为 Web 服务的业务逻辑。

我想知道下面进一步描述的场景是否有最佳实践。

  1. 我在服务器启动时创建一个 StatefulKnowlegdeSession 单例

  2. 初始化 时,我将超过 100.000 个事实插入到 StatefulKnowlegdeSession 中。我称这些为“静态事实”,因为它们永远不会被规则修改。静态事实更像是一组大查找表。

  3. 现在规则引擎被放置到一个网络服务 (Tomcat) 中。 Web 服务接收一个 Request 对象,该对象将被插入到 KnowledgeSession 中。在 fireAllRules() 之后,我希望 KnowledgeSession 计算一个输出对象,该对象将作为 Web 服务响应返回。

  4. Response 的计算使用了静态事实。这些规则创建了许多临时对象,这些对象使用insertLogical() 插入到工作内存中。这确保一旦我在 Web 服务调用结束时收回原始 Request 对象,所有垃圾都会从工作内存中移除。

现在的问题是我将如何在多线程服务器中实现它?

  • 我只想使用一个 StatefulKnowledgeSession 实例(单例),因为静态事实很大,可能会成为内存问题。

  • 不能使用在每次 Web 服务调用开始时新创建的 StatelessKnowledgeSessions,因为插入所有静态事实会花费太长时间。

  • 我知道 StatefulKnowlegdeSession 不是线程安全的。此外,分区选项不再受支持。

  • 但是,不同的线程可以使用不同的 WorkingMemoryEntryPoints/EntryPoints。我可以使用入口点的,每个 Web 服务调用都将使用池中的一个实例来插入 Web 服务请求。

这也意味着我需要增加我的规则 (?) 每个规则都使用一个特定的入口点,或者至少是第一条规则,匹配网络服务请求对象:

rule “entry rule for WORKER-1” // rule to be duplicated for entry points WORKER-2, WORKER-3,...
when
$req : Request () from entry-point “WORKER-1”
$stat : StaticFact( attr = $req.getAttr() )
then
insertLogical( new SomeTemporaryStuff ( $req ) );
end

rule “subsequent rule”
when
$tmp : SomeTemporaryStuff()
then
...go on with the calculation and create a Response at some point...
end

后续规则会在工作内存中创建临时对象,在这一点上,如果我用数十个并发请求轰炸引擎,我真的很害怕弄乱一些东西。

  • 我也可以在“fireUntilHalt”模式下启动 KnowledgeSession,但在这种情况下,我不知道如何从规则引擎获得同步响应以将其作为 Web 服务响应返回。

最佳答案

我不会使用多个入口点。将请求排队到运行 session 的线程。如果您想使用多核,请运行多个服务或服务线程。

对于您的 10 万个事实,请仔细检查其字段的表示方式。 String.intern() 可能会提供可观的节省。可以共享其他对象——因为它都是静态的。通常,在这种情况下,元素构造期间的一些额外开销在以后是有益的,例如,更少的 GC 开销。

(否则这是一个非常好的总结,几乎是运行此场景的“方法”。+1

关于java - Drools 单例 StatefulKnowledgeSession 作为 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22509997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com