数据驱动规则引擎 - 流口水

Jas*_*per 11 java rules drools decision-tree

我一直在评估Drools作为规则引擎,用于我们的业务Web应用程序.

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

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

所以,
- 我想让管理员用户在我的Web App UI中指定这些规则.
- 我可以将这些"规则"存储在数据库中,然后通过Drools对它们进行操作 - 至少允许我通过"自己的"UI"修改"这些规则.所以这就像数据库中的决策表.
- 最好的方法是什么?

Bil*_*win 5

鉴于我对数据驱动的业务规则的回答,您让我回答您的问题.我对这个问题的回答是,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认同)

Ste*_*eve 5

  • 我无法向最终用户提供用于修改规则的有意义的 UI。

开箱即用,Guvnor 提供基于 Web 的决策表如果您愿意,还可以提供Excel),正如您所说的那样。它为更复杂的规则提供了指导编辑器,但您的规则看起来非常简单。

  • 从最终用户的角度来看,Guvnor UI 或任何修改 drl 文件的编辑器是不可接受的

如前所述,Guvnor 支持决策表。如果您不喜欢 Guvnor Web 应用程序的布局,那么您可以将 Guvnor 编辑器嵌入到您自己的 Web 应用程序中。

  • 这些规则中的大多数将在 db 中可用的大量数据上运行

数据库的大小与 Guvnor 的使用无关。Guvnor 用于编辑规则,而不是运行时评估。Drools Expert 是运行时规则引擎。它很快。它可以处理非常大量的数据和非常大量的规则。您需要做的就是编写数据库查询,以便在运行时将该数据的相关块获取到规则引擎中。无论您尝试实施什么解决方案,您都需要这样做。

附带说明一下,如果您真正想要的是解释规则引擎何时是问题的好(和坏)解决方案,那么我建议您阅读为什么使用规则引擎?Drools 专家手册的部分。


小智 1

一般来说,我发现在更抽象的级别(例如域模型)工作更容易,并且从该级别到 Drools 规则进行某种编程转换,而不是直接处理 Drools 规则。这样,您可以按照自己喜欢的方式存储域模型,并且可以围绕它构建 UI 等,并且仍然可以选择按需生成 Drools 规则。接下来的挑战是创建从模型到 Drools 规则的编程转换,但模板工具在这里会有所帮助。我为此使用了 Groovy 模板,效果很好。