我一直在关注WF Rules Engine和NxBRE这看起来很有趣,但我不确定它在现实生活中会有多好。
我想到的就像一个事实基础,有大约一亿到一亿个事实和规则,如:
Object.Field< 5000 AND Object.Field> 1000 AND IsProperty(Object.Field2)
我正在使用C#和.NET。
编辑:我没有说清楚(完全是我的错):)我有自己的规则评估系统,它使用RETE算法本身...它很快,它可以评估大约10秒内的1000万事实情景......共同商业解决方案的速度有多快?
答案 0 :(得分:8)
简短的回答是,一旦规则数量超过某些(我不知道确切的值)阈值,我会期望规则引擎优于命令式解决方案。
规则引擎的规则部分是一组条件和操作。单个规则(几乎)在功能上等同于if-then语句。由于引擎的声明性质,规则引擎的真正力量闪耀着。
在传统的命令式程序中,您必须编写逻辑评估方式。使用规则引擎时,它会确定要评估的语句数。我只使用Jess或CLIPS等引擎,它们使用rete algorithm来确定要触发的规则。规则触发算法的效率将推动规则引擎相对于传统的命令式解决方案的效率提高效率。
Rete算法旨在牺牲内存以提高速度。它维护一个节点网络,将LHS侧模式映射到规则。规则和规则越多你拥有的事实,你的rete网络将比你的命令式解决方案更好,因为Rete性能在理论上与系统中的规则数量无关。
你正在计划很多事实。如果你计划有很多规则,你可能会遇到内存问题。
看看Martin Fowler关于rules engines的文章。这是一个很好的(非常)简短的概述。
Microsoft Business Rules Engine(MS-BRE)上有a lengthy discussion,与Jess& Drools的。提出的几个要点强调了为什么这些评估很难。
答案 1 :(得分:4)
“这不是忠实的rete实现的谣言”是指一个古老的问题,即有关BizTalk Server附带的业务规则引擎无法正确实现Rete算法的说法。顺便说一下,索赔是不正确的。 BRE肯定会实现Rete。 WF规则引擎是与BRE完全不同的技术。正如Karl所说,WF规则引擎根本没有正确或错误地实现Rete。这是一个可以被称为“顺序”引擎的例子。它实现了一种前向链接形式。然而,真正的问题比这复杂一点。 “forward”位指的是引擎可以执行的逻辑推理类型。这个术语并没有真正告诉你运行时涉及的机制。真正的问题是引擎的推理有多好。是的,WF可以前向链接,是的,它可以推理,但只能以非常有限的方式。 Rete引擎提供了更强的推理能力但这实际上与Rete算法的使用无关,Rete算法实际上只是对某类规则引擎(称为“生产”系统)的优化。它与生产系统可以推理整个“事实基础”的方式有关,而顺序WF规则引擎只能直接推理单个事实的粗略等价物。问题有时会出现,因为人们混淆了一个特定的运行时机制,它能够实现正向链接与正向链接本身的逻辑过程(毕竟,这是一个非常微妙的区别)。 WF中的相关机制当然可以用于在有限的范围内以“前向”方式推理,但其主要用途是允许以半声明方式表达顺序规则 - 即,规则可以以任何顺序表达无论这些规则之间的程序依赖性如何。这与前瞻性推理无关,或者与前瞻性链接的过程无关。
这个问题有点复杂和模糊,我知道MS的一些人不同意我(我们经常讨论它),但这是我的看法。
答案 2 :(得分:2)
要注意的一件事是,WF规则引擎实际上是它实现了自己的解析器,因此,它的表现力有些受限,并且确实有性能方面的考虑,因为它几乎都在进行字符串解析。在运行时将规则解释为代码(可执行操作)。
答案 3 :(得分:2)
我们使用JBoss Drools在7分钟内通过1500条规则运行了2400万次测试,其中两台JVM在相当平均的服务器上运行。如果你运行每个组合,那就要运行超过3660亿个测试,并且大多数测试都有多个逻辑选择。 (例如,您的示例有三个选项。)
答案 4 :(得分:0)
您还必须考虑如何将数据传递到规则引擎中,例如一旦规则开始触发,并且某些规则调用数据库,那么肯定会出现性能问题。最好的做法是在开始时提供规则执行所需的所有数据,尽管这也有一些缺点。