java - 有没有办法重用知识库,而不是通过无状态知识 session 重新插入所有事实?

标签 java drools

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

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

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

由于大多数运行之间唯一发生变化的事实是新消息,因此我希望我可以有一个初始知识库,其中加载了每个无状态 session 都可以开始的其他(非消息)事实,然后我只需要将消息本身加载到每个消息中,就像我对有状态所做的那样。

这可能吗?

我正在使用批量插入,据我所知,这似乎并没有真正影响我的性能,但必须每分钟重新插入这几千个事实 10k 次似乎仍然是错误的。

最佳答案

老实说,无状态 session 只是包装有状态 session 并从中删除一些功能(即您无法将内容弹出或弹出)。

插入大量事实通常是一个缓慢的过程。没有机制可以将它们快速加载到新 session 中。插入-评估-收回解决方案可以非常快,因为它们使您能够强制引擎根据最初的 10k 事实来平衡自身,因此额外的事实会导致最少的重新评估。

多线程并不意味着您需要无状态。我建议只创建一个有状态 session 池,并已插入最初的 10k 事实。您只需要一点额外的逻辑来确保每当这些基本事实之一发生更改时,您都会更改所有 session (听起来这种情况并不经常发生)。显然,这将使您的应用程序更加占用内存,但这是一种简单的扩展方法。

而且您没有说有状态 session 的速度有多慢。我采用了响应时间为 30 秒的 Drools 应用程序,并让它在不到一秒的时间内提供数百个响应。我不知道你的 DRL 编码能力有多棒,据我所知,可能只是你需要重写一些规则。也许这是一个单独问题的食物。 :)

关于java - 有没有办法重用知识库,而不是通过无状态知识 session 重新插入所有事实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18300327/

相关文章:

java - 通过代理类公开静态方法

java - 全局初始化的 Drools 规则测试

java - 检查对象是否在列表中的规则

java - 在 Drools 声明类型中包含函数

eclipse - DSL、DSLR、DRL之间的区别流口水

java - 联合正则表达式java

java - 基于java中的正则表达式拆分成不同的字符串

java - 在一项 Activity 中添加两个 GalleryView

java - git 文件中的奇怪名称

java - maven编译时校验drl文件