数据驱动规则引擎 - Drools
Posted
技术标签:
【中文标题】数据驱动规则引擎 - Drools【英文标题】:Data Driven Rules Engine - Drools 【发布时间】:2013-08-23 22:51:57 【问题描述】:我一直在评估 Drools 作为我们的业务 Web 应用程序中使用的规则引擎。
我的用例是一个订单管理应用程序。规则如下: - 如果用户类型为“特殊”,则额外提供 5% 的折扣。 - 如果用户已经购买了 10 次以上,则额外提供 3% 的折扣。 - 如果产品类别为“旧”,则向用户赠送价值 5 美元的礼品篮。 - 如果产品类别为“新”,则向用户赠送价值 1 美元的礼品篮 - 如果用户过去购买过 1000 美元以上的商品,则免运费
我看到的直接挑战是: - 我无法提供给最终用户修改规则的有意义的 UI。 - 从最终用户的角度来看,Guvnor UI 或任何编辑器修改 drl 文件是不可接受的 - 这些规则中的大多数将在 db 中可用的大量数据上运行
那么, - 我希望管理员用户可以在我的 Web 应用 UI 中指定这些规则。 - 我可以将这些“规则”存储在数据库中,然后通过 Drools 对它们进行操作 - 至少这允许我通过我的“自己的”用户界面“修改”这些规则。所以这有点像 DB 中的决策表。 - 最好的方法是什么?
【问题讨论】:
【参考方案1】:根据我对Data driven business rules 的回答,您要求我回答您的问题。我对这个问题的回答是,SQL 对于执行 存储在数据库中的业务规则来说是一个糟糕的解决方案。问这个问题的人想从他们存储的业务规则中生成 SQL 表达式,我告诫不要这样做,因为这会导致安全性、可测试性、性能和维护方面的问题。
我没有使用过 Drools,但我从文档中了解到它包括 Guvnor,这是一个业务规则管理器,支持将 RDBMS 用作用户定义规则的存储库。
[Drools] Guvnor 使用 JCR 标准来存储规则等资产。默认实现是 Apache Jackrabbit,http://jackrabbit.apache.org。这包括一个开箱即用的存储引擎/数据库,您可以按原样使用它,或者在需要时配置为使用现有的 RDBMS。 (http://docs.jboss.org/drools/release/5.2.0.Final/drools-guvnor-docs/html/chap-database_configuration.html)
Apache Jackrabbit 不是 RDBMS,它是“内容存储库是一种分层内容存储,支持结构化和非结构化内容、全文搜索、版本控制、事务、观察等。”这似乎是更适合 Drools 的存储库。
但 Drools 并没有说它会尝试使用 SQL 来执行那些业务规则。它有一个单独的组件,Drools Expert(规则引擎)可以做到这一点。
Drools Expert 是一个声明式、基于规则的编码环境。这使您可以专注于“您想要做什么”,而不是“如何做”。 (http://www.jboss.org/drools/drools-expert.html)
SQL 也是一种声明性编程语言,但它旨在对表结构数据执行关系操作。实现规则引擎的语言有不同的目标,并且可能可以做 SQL 不能做的事情(反之亦然)。
所以我建议如果您使用 Drools,请随意使用 RDBMS 作为他们记录的存储库(使用他们的 JCR 兼容的内容存储库实现,不要尝试自己设计)。然后使用他们的 Drools Expert 作为一种专门用于执行规则的语言。
【讨论】:
我同意用 SQL 实现业务逻辑是一个非常糟糕的主意,但是将业务规则存储在数据库中,然后由“规则引擎”处理并在“规则引擎”中执行并不是一个坏主意。事实上,我构建了一个基于物料清单的产品“配置器”,它使用这些清单作为业务规则,影响可以组合哪些部件来创建定制产品。规则由基于 javascript 的引擎评估,但在账单本身中维护。【参考方案2】:没有任何有意义的 UI 可供最终用户修改规则。
Guvnor 开箱即用地提供web based decision tables(和Excel if you prefer),正如您所说的那样。它为更复杂的规则提供了guided editors,但您的规则看起来很简单。
从最终用户的角度来看,Guvnor UI 或任何编辑器修改 drl 文件是不可接受的
如前所述,Guvnor 支持决策表。如果您不喜欢 Guvnor Web 应用程序的布局,那么您可以将embed the Guvnor editors 放入您自己的 Web 应用程序中。
这些规则中的大多数将在 db 中可用的大量数据上运行
数据库的大小与 Guvnor 的使用无关。 Guvnor 用于编辑规则,而不是运行时评估。 Drools Expert 是运行时规则引擎。它很快。它可以处理非常大量的数据和非常大量的规则。您需要做的就是编写数据库查询,以便在运行时将相关数据块获取到规则引擎中。无论您尝试实施何种解决方案,您都需要这样做。
附带说明,如果您真正想要的是解释规则引擎何时是解决问题的好(坏)解决方案,那么我建议您阅读 Drools 专家手册的Why use a Rule engine? 部分。
【讨论】:
【参考方案3】:一般来说,我发现在更抽象的级别上工作更容易,例如领域模型,并且从它到 Drools 规则进行某种编程转换,而不是直接处理 Drools 规则。这样,您可以随心所欲地存储域模型,并且可以围绕它构建 UI 等,并且仍然可以选择按需生成 Drools 规则。然后挑战是创建从您的模型到 Drools 规则的程序化转换,但模板工具将在这里提供帮助。我为此使用了 Groovy 模板,效果很好。
【讨论】:
kevinpeterson> 感谢您的投入,但为什么还要费心将您的域规则转换为 drl(流口水)?有什么好处,我们可以很容易地从网络应用程序中解释域规则。然后基本上归结为 - 为什么流口水。我在这些领域没有经验,因此提出了这些问题。以上是关于数据驱动规则引擎 - Drools的主要内容,如果未能解决你的问题,请参考以下文章