我一直在评估Drools作为规则引擎,用于我们的业务Web应用程序。
我的用例是订单管理应用程序。
规则属于以下类型:
- 如果用户类型为“特殊”,则额外享受5%的折扣。
- 如果用户已经购买了10+,请额外享受3%的折扣。
- 如果产品类别为“旧”,请向价值5美元的用户赠送礼品篮。
- 如果产品类别为“新”,请向价值1美元的用户赠送礼品篮
- 如果用户过去购物超过1000美元,则免费送货
我看到的直接挑战是:
- 我可以向最终用户提供修改规则的有意义的UI。
- 从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器是不可接受的
- 这些规则中的大多数将在db中可用的大量数据上运行
所以,
- 我希望管理员用户能够在我的Web App UI中指定这些规则。
- 我可以将这些“规则”存储在数据库中,然后通过Drools对它们进行操作 - 至少允许我通过“自己的”UI“修改”这些规则。所以这就像DB中的决策表。
- 最好的方法是什么?
鉴于我的回答,你让我回答你的问题 数据驱动的业务规则。我对这个问题的回答是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是一个糟糕的解决方案 执行 存储在数据库中的业务规则。问这个问题的人想要从他们存储的业务规则中生成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作为专门用于执行规则的语言。
开箱即用,Guvnor提供 基于网络的决策表 (和 Excel,如果您愿意),正如你所说,你想提供。它提供 指导编辑 对于更复杂的规则,但您的规则似乎非常简单。
- 从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器都是不可接受的
如上所述,Guvnor支持决策表。如果您不喜欢Guvnor Web应用程序的布局,那么您可以 嵌入Guvnor编辑 进入您自己的Web应用程序。
数据库的大小与Guvnor的使用无关。 Guvnor用于编辑规则,而不是运行时评估。 Drools Expert是运行时规则引擎。它很快。它可以处理大量数据和大量规则。您需要做的就是编写数据库查询,以便在运行时将相关的数据块放入规则引擎中。无论您尝试实施什么解决方案,都需要这样做。
从侧面说明,如果您真正关注的是规则引擎何时是问题的好(和坏)解决方案的解释,那么我建议您阅读 为什么要使用规则引擎? Drools专家手册的一节。
一般来说,我发现更容易在更抽象的层面上工作,比如域模型,并且从那里到Drools规则进行某种程序化转换,而不是直接处理Drools规则。这样,您可以根据需要存储域模型,并且可以围绕它构建UI等,并且仍然可以选择按需生成Drools规则。然后挑战就是创建从模型到Drools规则的程序化转换,但模板工具在这里会有所帮助。我已经使用了Groovy模板,它运行良好。