我的服务每分钟接收大约 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/