我有一项服务,每分钟接收大约10k条信息,我需要实时处理这些信息。为了处理这些问题,我需要在知识库中找到几千个事实。
最初,我使用了一个有状态的知识会话,在其中加载了这些事实。我会插入一条消息,运行规则,撤回消息,然后重复。这起作用不错,但表演还不够。
我需要这个进程是多线程的,为此我理解我需要无状态会话。我在无状态会话中遇到的问题是,对于我处理的每一条消息,我现在都需要将这几千个事实重新插入到知识库中。
由于大多数运行中唯一改变的事实是新消息,所以我希望自己能有一个初始知识库,加载其他(非消息)事实,每个无状态会话都可以从这些事实开始,然后我只需要将消息本身加载到每个消息中,就像我使用有状态信息时所做的那样。
这个是可能的吗?
我正在使用批处理插入,据我所知,这似乎并没有真正扼杀我的性能,但似乎仍然是错误的,必须重新插入这几千个事实每分钟10k次。
发布于 2013-08-27 18:03:36
老实说,无状态会话只是封装有状态会话,并从其中删除一些功能(即不能弹出内容)。
插入大量事实通常是一个缓慢的过程。没有机制可以将它们快速加载到新的会话中。插入-评估-撤回解决方案可以相当快,因为他们使你迫使引擎平衡自己与最初的10k事实,所以额外的事实导致最小的重新评估。
多线程并不意味着您需要变成无状态。我建议只创建一个有状态会话池,其中已经插入了初始的10k事实。您只需要一点额外的逻辑,以确保每当这些基本事实中的一个被更改时,您就会更改所有的会话(听起来不像经常发生这种情况)。显然,这将使您的应用程序更加占用内存,但这是一种简单的扩展方法。
你也不会说有状态的会话有多慢。我使用了一个30秒响应时间的Drools应用程序,它在不到一秒钟的时间内提供了数百个响应。我不知道你的DRL编码技巧有多棒,据我所知,这可能只是你需要做一些规则重写。也许这是另一个问题的食物。:)
https://stackoverflow.com/questions/18300327
复制相似问题