坚持Drools知识会议

时间:2013-02-12 20:37:55

标签: drools drools-fusion

我在一个学区工作,我们正在计划使用Drools为地区学校的学生群体实施以下类型的规则:

  • 如果学生在一年内有3次缺勤,他们的出勤率会转为WARN状态。
  • 如果学生在一年内有6次缺勤,他们的出勤率会变为临界状态。
  • 如果学生在一年中有3个主要行为事件,他们的行为指标会转为WARN状态。
  • 如果学生在一年中有2次轻微和2次重大行为事件,他们的行为指标就会变为临界状态。
  • ......这些只是我头脑中的例子,但还有更多类似性质的规则。

所有这些规则都可以使用Drools专家简单表达。此外,学生的规则处理不需要是同步的。关于实现此问题的最佳方法,我有几个问题。

  1. 从一个角度来看,这可以被视为一个事件流的监控系统。这让我想到创建一个有状态的会话,每个新事件都将插入其中。然而,事件发生在9个月的过程中并且相对不频繁。此外,我们可以为每个学校建立一个会话,或者每个学生建立一个会话。

    • 长期保持会话在内存中是个问题吗?
    • 如果服务器出现故障,我们是否需要从头开始重建会话状态,或者建议定期拍摄快照并恢复自快照时起发生的事实。
  2. 另一个选择是在为该学生处理事件后为每个学生保留一个会话。当下一个事件进入时,我们将从存储中检索其会话并插入新事实。这样我们就不需要为引擎的每次运行检索所有事实以获得学生的状态。会支持这样的配置吗?这样做是否有任何缺点?

  3. 第三种方法是通过检索规则需要运行的所有其他事实,创建新的KnowledgeSession并运行规则来响应学生的新事实。

  4. 对于什么是最佳方法的任何建议都将不胜感激。

    戴夫

4 个答案:

答案 0 :(得分:2)

我会选择解决方案2:每个学生一个课程。鉴于你不打算与会话进行太多交互,我会把它保存在数据库中,只在需要时恢复它:新的缺席/事件到来,该学生的会话从db恢复,事实插入后,将执行规则并检索结果状态。

我在这种情况下看到的主要缺点是,创建关于多个学生的规则并不简单,您必须将您的事实提供给多个会话。例如,如果您在一个班级中有超过10名具有重要地位的学生,则需要发出警报。在这种情况下,每个类的会话就足够了。所以,正如你所看到的,你必须决定什么对你更好。但无论你选择的“单位”(学校,班级,学生),我仍然会向你推荐我之前提到的执行流程。

Drools已经支持使用JPA的数据库持久性。您可以在此处获得有关此功能的更多信息:http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e3961

基本思想是,不使用kbase.newStatefulKnowledgeSession()创建ksessions,而是使用名为JPAKnowledgeService的帮助程序类。此类将返回StatefulKnowledgeSession的包装器,该包装器将在每次方法调用后保持其状态。在本课程中,您将找到两个重要方法:newStatefulKnowledgeSession(),用于创建新的ksession,loadStatefulKnowledgeSession()用于从数据库中检索现有会话。

希望它有所帮助,

答案 1 :(得分:1)

有第四种选择可以使维护更简单。为所有学生建立整个学区的单一状态知识会话。处理完每个事件后,如果需要在JVM发生故障时重建工作内存,则会保留会话。您将需要更大的RAM和堆空间分配,但在今天的RAM中便宜。 (我们使用32 GB RAM并分配16 GB XM和Xmx)最有可能的是,只要你有24x7服务器,你的JVM就永远不会停机。

答案 2 :(得分:0)

懒惰我会选择第三种方法。我将所有事件存储在数据库中,然后我将按照每天,每周,每月(根据需要)批量处理所有学生。这将允许您创建一个会话,其中包含涵盖多个学生,班级等的规则。 如果您没有超过3百万的学生,那么您将会很好,这将是一个高性能的应用程序。

答案 3 :(得分:0)

感谢您的建议和意见。我倾向于#2有几个原因:

  • 我认为收集所有事实让特定学生从头开始重新运行所有事件,这将是一个我宁愿避免的重量级过程。
  • 用例我正在处理模型作为一个非常长时间运行的监控过程,这使我相信(在阅读Fusion的用例之后)将事件插入到持久的KnowledgeSession中是可行的。
  • 我不认为问题空间的范围(即学生与教室,学校或整个地区)是一个问题。如果我们需要课堂指标,那么我们将只为一些新的规则库提供相关事件(测试,缺勤等)。

唯一需要注意的是,如果规则发生变化,我们需要根据新的规则库重新评估所有受影响的学生,这意味着从学年开始收集所有事实。这应该不会发生太多,但如果它变得更频繁,那么我可能会转向第3种方法。

再次感谢您的帮助。