5

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

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

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

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

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

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

任何关于什么可能是最好的方法的建议将不胜感激。

戴夫

4

4 回答 4

3

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

我在这种情况下看到的主要缺点是为多个学生创建规则并不简单,您必须将事实提供给多个会话。例如,如果您想在单个班级中有超过 10 名处于 CRITICAL 状态的学生时发出警报。在这种情况下,每堂课一次就足够了。因此,如您所见,您必须决定什么对您更好。但无论您选择哪个“单位”(学校、班级、学生),我仍然会向您推荐我之前提到的执行流程。

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

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

希望能帮助到你,

于 2013-02-13T08:52:34.730 回答
1

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

于 2013-06-06T17:00:40.903 回答
0

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

于 2013-02-13T12:09:24.967 回答
0

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

  • 我认为为给定的学生收集所有事实,然后从头开始为每个发生的事件重新运行它们将是一个我宁愿避免的繁重过程。
  • 我将模型作为一个非常长时间运行的监控过程来处理的用例,这使我相信(在阅读了 Fusion 的用例之后)将事件插入持久 KnowledgeSession 是可行的方法。
  • 我不认为问题空间的范围(即学生与教室、学校或整个学区)是个问题。如果我们需要课堂指标,那么我们将拥有一个新的课程规则库,该规则库也消耗相关事件(测试、缺勤等)

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

再次感谢您的帮助。

于 2013-02-13T17:05:34.060 回答