1

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

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

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

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

这可能吗?

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

4

1 回答 1

0

老实说,无状态会话只是包装了有状态会话并从中删除了一些功能(即,您不能将内容弹出和弹出)。

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

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

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

于 2013-08-27T18:03:36.177 回答