有没有办法重用知识库,而不是用无状态知识会话重新插入所有事实?

时间:2013-08-18 14:51:28

标签: java drools

我的服务每分钟接收大约10k条消息,我需要处理这些实时信息。为了处理这些,我需要知识库中的几千个事实。

最初我使用的是有状态知识会话,我在其中加载了这些事实。我会插入一条消息,运行规则,收回消息,然后重复。这个功能很好,但性能还不够。

我需要这个过程是多线程的,为此我明白我需要无状态会话。我对无状态会话的问题是,对于我处理的每条消息,我现在需要将这几千个事实重新插入到知识库中。

由于大多数运行之间的唯一事实是新消息,我希望我可以拥有一个初始知识库,其中包含我的每个无状态会话可以开始的其他(非消息)事实,然后我只需要将消息本身加载到每个消息中,就像我使用有状态一样。

这可能吗?

我正在使用批量插入,从我所知道的情况来看,这似乎并没有真正杀死我的表现,但是每分钟重新插入几千个事实似乎仍然是错误的。

1 个答案:

答案 0 :(得分:0)

说实话,无状态会话只包含一个有状态会话并从中删除一些功能(即你不能弹出进出)。

插入大量事实通常是一个缓慢的过程。没有机制可以将它们快速加载到新会话中。 Insert-evaluate-retract解决方案可以非常快,因为它们可以让您强制引擎与最初的10k事实相平衡,因此额外的事实会导致最少的重新评估。

多线程并不意味着你需要无国籍。我建议只创建一个有状态会话池,已经插入了最初的10k事实。您只需要一些额外的逻辑来确保每当其中一个基本事实发生变化时,您就会改变所有会话(听起来不像经常发生的那样)。显然,这将使你的应用程序更多的内存占用,但它是一种简单的扩展方式。

你并没有说有状态会话有多慢。我采用了Drools应用程序,响应时间为30秒,并在不到一秒的时间内提供了数百个响应。我不知道你的DRL编码技巧有多棒,所以据我所知,你可能只需要重写一些规则。也许这是另一个问题的食物。 :)