我们有一个拥有数万个单位的系统。每个单元将有5-10米,每个仪表将具有与之相关的值。这些仪表的值会发生变化,我们需要我们的规则引擎才能实时响应这些变化。
我们将有这样的规则“如果#1单元的第一个仪表大于10,而单元#1的第二个仪表小于30则......”,尽管这些规则可能比这长得多。每个单元的规则将完全独立,因此不会有来自两个不同单元的两个不同米的值的规则。
我们将为每个单元提供大约30条相同的规则,然后每个单元将有大约5-15个自定义规则。在规则引擎运行时,需要动态添加这些规则。一个单位可能会在注册时添加5-10个规则,然后添加或删除规则,例如每周一次。
我们决定使用Drools,我正在努力弄清楚如何最好地实现它。我对Drools很新,所以我有点困惑。每个单位都有自己的知识库是否有意义?如果是这样,有没有办法分享每个单位相同的规则?
我担心我们可能没有足够的内存来存储所有这些规则,所以我想如果我们有每个单元的知识库,我们可以序列化所有知识库,将它们放在数据库中,并检索当我们需要它们时。那会合理吗?
我想为每个单元使用单独的知识库的另一个原因是因为每个单元的规则完全独立于其他单元的规则,所以将它们全部放入相同的知识库可能会有性能损失。这是正确的还是Rete算法足够聪明,可以解决这个问题?
此外,是否可以在引擎运行时动态添加规则?是否必须重新编译所有规则?如果发动机仍然需要实时响应仪表变化,那么需要多长时间才能实现?
谢谢你们。
答案 0 :(得分:2)
每个单位都有自己的知识库是否合理?如果是这样,有没有办法分享每个单元相同的规则?
请参阅下面的每个单元以拥有自己的知识库。出于组织目的,您可以考虑将它们放在单独的包中。要在包之间共享规则,您可以在全局区域中创建规则并导入它们。虽然这有助于分享共同的规则,但它有一些缺陷:
我担心我们可能没有足够的内存来存储所有这些规则,所以我在想如果我们有每个单元的知识库,我们可以序列化所有的知识库,把它们放进去在数据库中,并在需要时检索它们。那会合理吗?
这是一个选项,但如果规则发生变化,您将需要重新创建知识库。
我考虑为每个单元使用单独的知识库的另一个原因是因为每个单元的规则完全独立于其他单元的规则,所以将它们全部放入相同的知识库。这是正确的还是Rete算法足够智能来解决这个问题?
由 Michal Bali 撰写的 Drools JBoss Rules 5.0开发人员指南
Rete算法的性能在理论上是独立的 知识库中的规则数量。
此外,
如果你很好奇并希望看到一些基准,你可以找到它们 在drools-examples模块中,可从Drools Web下载 现场。还有一些网站定期发布基准测试 解决众所周知的数学问题的各种规则引擎 (例如,通常是'Miss Manners'测试和'Waltz') http://illation.com.au/基准/。 Drools的表现是 与其他开源甚至商用发动机相当。
此外,是否可以在引擎运行时动态添加规则?是否必须重新编译所有规则?如果发动机仍然需要实时响应仪表变化,那么需要多长时间并且这是否可行?
这里没有具体的想法,但我确信规则需要重新编译才能使用。在重新编译新包时,仍可以使用先前创建的kbase。他们是独立的。