【问题标题】:Data Driven Rules Engine - Drools数据驱动规则引擎 - Drools
【发布时间】:2013-08-23 22:51:57
【问题描述】:

我一直在评估 Drools 作为我们的业务 Web 应用程序中使用的规则引擎。

我的用例是一个订单管理应用程序。
规则如下:
- 如果用户类型为“特殊”,则额外提供 5% 的折扣。
- 如果用户已经购买了 10 次以上,则额外提供 3% 的折扣。
- 如果产品类别为“旧”,则向用户赠送价值 5 美元的礼品篮。
- 如果产品类别为“新”,则向用户赠送价值 1 美元的礼品篮
- 如果用户过去购买过 1000 美元以上的商品,则免运费

我看到的直接挑战是:
- 我无法提供给最终用户修改规则的有意义的 UI。
- 从最终用户的角度来看,Guvnor UI 或任何编辑器修改 drl 文件是不可接受的 - 这些规则中的大多数将在 db 中可用的大量数据上运行

那么,
- 我希望管理员用户可以在我的 Web 应用 UI 中指定这些规则。
- 我可以将这些“规则”存储在数据库中,然后通过 Drools 对它们进行操作 - 至少这允许我通过我的“自己的”用户界面“修改”这些规则。所以这有点像 DB 中的决策表。
- 最好的方法是什么?

【问题讨论】:

    标签: java drools rules decision-tree


    【解决方案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(流口水)?有什么好处,我们可以很容易地从网络应用程序中解释域规则。然后基本上归结为 - 为什么流口水。我在这些领域没有经验,因此提出了这些问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      相关资源
      最近更新 更多