为什么规则引擎而不是简单易懂的一行属性?
Why rules engine instead of easily comprehensible one line property?
我是规则引擎的新手,如果这个问题很基础,请多多包涵。规则引擎的所有教程都在说,您可以将业务逻辑移出代码并由 BA/最终用户更新它,而不是将其放入 Java 代码中。
我有以下问题
但是为什么我们不能编写代码来从 属性 文件中读取值并做同样的事情呢?
此外,与 .properties 文件相比,规则文件的语法似乎不仅仅是一行。
将这些规则放入规则引擎是否可以使 code/app 在不需要重新启动应用服务器的情况下工作?
3a。如果没有,那我们如何实现呢?
规则引擎并不总是答案。但是,它们在理论上提供了引擎可以对简单规则表达式执行复杂处理并 return 结果的优势。其他优点是规则的可见性和更少的代码。
您问题的答案。
可以。在简单的情况下,使用 属性 个文件是有意义的。
规则需要足够复杂以涵盖它们验证的业务问题。一个好的规则引擎使用可读的语法,即使它很复杂。
理论上,规则服务器可以 运行 独立于应用程序服务器。在大公司,这很正常。规则服务器可以允许在不重新启动的情况下进行更新,或者可以在不影响应用程序服务器的情况下重新启动(波纹状,如果有多个实例)。
- 当公司的业务用户希望设置某些规则并根据规则集的执行结果/结果决策来驱动应用程序时,规则引擎就会出现。此类公司的例子之一可能是律师事务所或保险公司,其中律师制定规则来推动保险的报价计算,并且规则会随着时间的推移而发生变化。 属性 文件是开发人员区域,业务用户可能无法熟练地进行更改。使用单独的规则引擎跟踪规则并使业务用户和开发人员一起工作以无缝地自动化业务,这对于属性文件来说可能很困难。
- 规则文件语法是将业务规则(口头)转换为可执行的编码指令的方法。这就是语法出现的地方。这样规则引擎就可以为业务实体及其关系提供数据抽象。
- 与规则引擎的集成可以通过一些代理或网络服务或其他任何东西来完成,基于此,服务器应用程序需要规则客户端 jar 来进行调用。因此,如果规则客户端 jar 更新,它的部署问题以及服务器如何获取更改/热部署。
最近几天一直在阅读,我认为(恕我直言)允许使用简单的电子表格更新业务规则的能力使规则引擎比 属性 文件更具优势。我可以使 属性 文件尽可能高度可配置,使用多个属性和指令来修改规则作为每个 属性 下的注释。
但在业务用户能够直接配置应用程序以根据电子表格中的 "decision table" 应用值的情况下,该解决方案将更为可取。
如果有任何其他(新手)开发人员在寻找规则引擎需求的理由时相信这个答案,请竖起大拇指!
- 如果逻辑发生变化,您将更改属性文件并再次部署整个项目。然而,如果您使用 BRMS 维护它,您可以仅在 BRMS 上单独更改和测试,而无需再次部署整个项目。一旦测试完成并且您最终想要部署新规则,那么也无需在生产中部署整个项目。如果您使用 KIE 服务器将规则公开为 API,则只需重新部署 KIE 服务器即可。
- 可以将所有逻辑都包含在顶行中的方式编写决策表。然后开发人员可以锁定并隐藏那些最上面的行,然后将其交给 BA。现在 BA 看不到任何逻辑,但知道如何维护文件。另外,并不是所有的逻辑都应该写成决策表。
- 正如我上面提到的,可以将每条规则部署为单独的其余部分 API,因此可以独立于其余部分进行部署。
最后,我想说我们使用 Redhat BRMS 的主要原因是,正如他们在文档中提到的那样:
- 敏捷性:无需让开发人员参与变更请求。 BA自己可以改变逻辑。
- 可见性:所见即所得(excel)。
- 一致性:每次都以相同的方式评估规则。
规则引擎只是组织许多规则的算法。见 Rete Algorithm.
基本上,一切都归结为复杂性。如果您有一些简单的规则,当然可以使用 .properties 文件。但是想象一下,如果您的一些规则是 'chained' - 一个规则会影响其他一些 属性,这会触发其他一些规则,这会改变另一个 属性...您必须扫描每条规则, 每一个变化。对于成千上万的规则,这将需要很长时间。因此 'rules engine'.
关于为什么应该或不应该使用规则引擎的文章有很多。这是一个很好的例子。
https://martinfowler.com/bliki/RulesEngine.html
我是规则引擎的新手,如果这个问题很基础,请多多包涵。规则引擎的所有教程都在说,您可以将业务逻辑移出代码并由 BA/最终用户更新它,而不是将其放入 Java 代码中。
我有以下问题
但是为什么我们不能编写代码来从 属性 文件中读取值并做同样的事情呢?
此外,与 .properties 文件相比,规则文件的语法似乎不仅仅是一行。
将这些规则放入规则引擎是否可以使 code/app 在不需要重新启动应用服务器的情况下工作?
3a。如果没有,那我们如何实现呢?
规则引擎并不总是答案。但是,它们在理论上提供了引擎可以对简单规则表达式执行复杂处理并 return 结果的优势。其他优点是规则的可见性和更少的代码。
您问题的答案。
可以。在简单的情况下,使用 属性 个文件是有意义的。
规则需要足够复杂以涵盖它们验证的业务问题。一个好的规则引擎使用可读的语法,即使它很复杂。
理论上,规则服务器可以 运行 独立于应用程序服务器。在大公司,这很正常。规则服务器可以允许在不重新启动的情况下进行更新,或者可以在不影响应用程序服务器的情况下重新启动(波纹状,如果有多个实例)。
- 当公司的业务用户希望设置某些规则并根据规则集的执行结果/结果决策来驱动应用程序时,规则引擎就会出现。此类公司的例子之一可能是律师事务所或保险公司,其中律师制定规则来推动保险的报价计算,并且规则会随着时间的推移而发生变化。 属性 文件是开发人员区域,业务用户可能无法熟练地进行更改。使用单独的规则引擎跟踪规则并使业务用户和开发人员一起工作以无缝地自动化业务,这对于属性文件来说可能很困难。
- 规则文件语法是将业务规则(口头)转换为可执行的编码指令的方法。这就是语法出现的地方。这样规则引擎就可以为业务实体及其关系提供数据抽象。
- 与规则引擎的集成可以通过一些代理或网络服务或其他任何东西来完成,基于此,服务器应用程序需要规则客户端 jar 来进行调用。因此,如果规则客户端 jar 更新,它的部署问题以及服务器如何获取更改/热部署。
最近几天一直在阅读,我认为(恕我直言)允许使用简单的电子表格更新业务规则的能力使规则引擎比 属性 文件更具优势。我可以使 属性 文件尽可能高度可配置,使用多个属性和指令来修改规则作为每个 属性 下的注释。
但在业务用户能够直接配置应用程序以根据电子表格中的 "decision table" 应用值的情况下,该解决方案将更为可取。
如果有任何其他(新手)开发人员在寻找规则引擎需求的理由时相信这个答案,请竖起大拇指!
- 如果逻辑发生变化,您将更改属性文件并再次部署整个项目。然而,如果您使用 BRMS 维护它,您可以仅在 BRMS 上单独更改和测试,而无需再次部署整个项目。一旦测试完成并且您最终想要部署新规则,那么也无需在生产中部署整个项目。如果您使用 KIE 服务器将规则公开为 API,则只需重新部署 KIE 服务器即可。
- 可以将所有逻辑都包含在顶行中的方式编写决策表。然后开发人员可以锁定并隐藏那些最上面的行,然后将其交给 BA。现在 BA 看不到任何逻辑,但知道如何维护文件。另外,并不是所有的逻辑都应该写成决策表。
- 正如我上面提到的,可以将每条规则部署为单独的其余部分 API,因此可以独立于其余部分进行部署。
最后,我想说我们使用 Redhat BRMS 的主要原因是,正如他们在文档中提到的那样:
- 敏捷性:无需让开发人员参与变更请求。 BA自己可以改变逻辑。
- 可见性:所见即所得(excel)。
- 一致性:每次都以相同的方式评估规则。
规则引擎只是组织许多规则的算法。见 Rete Algorithm.
基本上,一切都归结为复杂性。如果您有一些简单的规则,当然可以使用 .properties 文件。但是想象一下,如果您的一些规则是 'chained' - 一个规则会影响其他一些 属性,这会触发其他一些规则,这会改变另一个 属性...您必须扫描每条规则, 每一个变化。对于成千上万的规则,这将需要很长时间。因此 'rules engine'.
关于为什么应该或不应该使用规则引擎的文章有很多。这是一个很好的例子。 https://martinfowler.com/bliki/RulesEngine.html