5

我们有一个拥有数万个单元的系统。每个单位将有 5-10 米,每个米将有一个与之关联的值。这些仪表的值发生变化,我们需要我们的规则引擎能够实时响应这些变化。

我们将有这样的规则:“如果单元#1 的第一个仪表大于10,单元#1 的第二个仪表小于30,则......”,尽管规则可能比这长得多。每个单元的规则将是完全独立的,因此不会有规则以来自两个不同单元的两个不同仪表的值为条件。

我们将为每个单元设置大约 30 条相同的规则,然后每个单元将有大约 5-15 条自定义规则。这些规则需要在规则引擎运行时动态添加。一个单位很可能会在注册时添加 5-10 条规则,然后从那时起每周添加或删除一条规则。

我们决定为此使用 Drools,我正在尝试找出如何最好地实现它。我对 Drools 真的很陌生,所以我有点困惑。每个单元都有自己的知识库有意义吗?如果是这样,有没有办法共享每个单元相同的规则?

我担心我们可能没有足够的内存来存储所有这些规则,所以我在想如果我们为每个单元都有一个知识库,我们可以将所有知识库序列化,将它们放入数据库中,并在我们使用时检索它们需要他们。那会合理吗?

我考虑为每个单元使用单独的知识库的另一个原因是,每个单元的规则完全独立于其他单元的规则,将它们全部放入同一个知识库可能会影响性能。这是正确的还是 Rete 算法足够聪明来解决这个问题?

此外,是否可以在引擎运行时动态添加规则?是否必须重新编译所有规则?如果发动机仍需要实时响应仪表变化,这需要多长时间?这是否可行?

多谢你们。

4

1 回答 1

2

每个单元都有自己的知识库有意义吗?如果是这样,有没有办法共享每个单元相同的规则?

请参阅下面的每个单元以拥有自己的知识库。出于组织目的,您可以考虑将它们放在单独的包中。要在包之间共享规则,您可以在全局区域创建规则并导入它们。虽然这将有助于共享通用规则,但它有一些缺陷:

  • 当您有大量包时,您需要在第一次手动导入它们。
  • 当您修改特定包中的导入规则时,它将更改全局规则,因此更改会影响所有其他导入规则的包。在 guvnor UI 中,无法直观地判断规则是导入的还是特定于包的。

我担心我们可能没有足够的内存来存储所有这些规则,所以我在想如果我们为每个单元都有一个知识库,我们可以将所有知识库序列化,将它们放入数据库中,并在我们使用时检索它们需要他们。那会合理吗?

这是一个选项,但如果规则发生变化,您将需要重新创建知识库。

我考虑为每个单元使用单独的知识库的另一个原因是因为每个单元的规则完全独立于其他单元的规则,将它们全部放入同一个知识库可能会影响性能。这是正确的还是 Rete 算法足够聪明来解决这个问题?

Michal Bali所著的Drools JBoss Rules 5.0 Developer's Guide一书说

Rete算法的性能理论上与知识库中规则的数量无关。

更远,

如果您好奇并想查看一些基准测试,您可以在可从 Drools 网站下载的 drools-examples 模块中找到它们。还有一些网站定期发布各种规则引擎的基准测试解决众所周知的数学问题(通常是“Miss Manners”测试和“Waltz”),例如, http: //illation.com.au/benchmarks/。Drools 的性能与其他开源甚至商业引擎相当。

此外,是否可以在引擎运行时动态添加规则?是否必须重新编译所有规则?如果发动机仍需要实时响应仪表变化,这需要多长时间?这是否可行?

这里没有具体的想法,但我确信规则需要重新编译才能使用。重新编译新包时,仍然可以使用之前创建的 kbase。他们是独立的。

于 2012-09-11T08:29:09.387 回答