当前位置: 首页 > 知识库问答 >
问题:

使用Drools Guvnor进行规则开发和部署管理

魏凯捷
2023-03-14

Drools Guvnor有自己的版本控制系统,在生产使用中允许应用程序的用户修改规则和决策表,以适应业务的变化。然而,同样的资产仍然存在于开发版本控制系统中,在该系统中开发了应用程序的新功能。

这篇文章是为了寻找在使用Drools rules和Guvnor时关于规则开发和部署的见解/想法/经验。

下面是一些我一直困惑的关键概念。

首先,将drl文件和决策表部署到正式生产环境的最佳方式是什么?只需将它们放在zip包中,然后解压缩到Web-Dav文件夹即可?我在Drools中导航的是,我没有找到一次导入多个文件方法。不过,事实模型可以添加为jar存档。Guvnor似乎有某种REST API,但使用它需要自定义部署脚本。

其次,一旦应用程序投入生产,用户可能希望更改决策表中的值,以便为高级客户等设置更高的折扣百分比。这一切都很好,直到开始开发应用程序2.0版为止。

现在我们所拥有的是

  • 版本控制系统中的drl文件和决策表
  • 用户修改的正式生产环境中的drl文件和决策表,由Guvnor版本化

现在,我们即将从Guvnor获取规则和决策表。再说一遍,Web Dav文件夹是最好的吗?还有什么其他选项?

今天的合并工具甚至可以处理Excel文件差异,但对我来说,在大型项目中,这听起来像是一个合并地狱。

另一个主题是事实模型完整性。对于假定的2.0版本,开发人员总是希望进行重构并将整个事实模型颠倒过来。尽管如此,它必须与以前的版本保持向后兼容,因为可能有用户修改的规则依赖于此。有什么建议吗?保持事实模型简单明了?提前计划/建议用户想要更改的内容?

我敢肯定,我不是第一个,也肯定不是最后一个考虑使用Drools和Guvnor进行部署和更改管理的人。因此,我想听到的是关于处理这些情况的一些最佳做法(以及为了避免这些做法的最坏做法)的评论、讨论、提示等。

谢谢

共有1个答案

蒋骏
2023-03-14

做事的最佳方式在很大程度上取决于您的特定应用程序和您工作的环境。然而,以下是我自己的经验。请注意,我现在只补充几点。当事情发生时,我可能会回到这个答案。

初始上线后,保持发布增量和小型

对于您的第一个版本,您有机会尝试一些东西。利用这个机会,尽可能多地进行重构,因为...

您的应用程序已上线,您的业务用户正在决策表中维护规则。您在业界人士所称的“业务敏捷性”方面取得了巨大的进步。不幸的是,这往往以牺牲应用程序开发灵活性为代价。所有引导编辑器规则和决策表规则都与事实模型相关联,因此该事实模型现有属性的任何更改都将破坏决策表。与目前大多数IDE不同,您不能只右键单击一个事实的getX()方法,重命名它,然后期望所有依赖该属性的代码都得到更新。

决策表和引导规则很难重构。如果一个事实已被重命名,那么在许多(所有?)版本的Guvnor中,该规则/表将不再打开。您需要通过WebDav获取底层XML文件并进行一些文本搜索和替换。这可能非常困难,考虑到要做到这一点,您需要将文件从生产环境下载到测试环境,进行更改,测试它们,将它们部署到测试环境。当您对您的更改感到满意时,您需要将它们推送回“生产”Guvnor。不幸的是,在您这样做的同时,用户已经更新了许多决策表,您需要重新开始,或者重新应用过去几天的更改。在理想的情况下,您的业务用户会同意在一段时间内不更改规则。但使其可行的唯一方法是保持更改较小,以便您可以根据他们的慷慨程度在几个小时或一天内进行更改。

为了缓解这种情况:

  1. 将Guvnor中使用的事实与您的应用程序域类分开。然后,您的应用程序开发人员可以将内部应用程序模型重构为他们的核心内容,但此类更改不会影响业务模型。维护两者之间的映射,并确保有涵盖这些映射的测试。
  2. 避免更改,例如重命名事实或其属性。确保您创建的事实及其属性具有适合域的名称并与业务一致。另一方面,添加新属性相对来说没有痛苦。非常值得提示用户关注他们的未来计划。
  3. 让事实尽可能简单。除非您真的需要,否则不要比名称-值对更复杂。一方面,您的业务用户会发现维护规则要容易得多。您在Guvnor中管理的任何内容的优先级都应该始终是让业务用户易于维护。
  4. 将外部依赖关系排除在您的事实之外。开发人员可能认为将事实注释为JPA@Entity是个好主意,以便于持久化。不幸的是,这增加了需要添加到Guvnor的类路径中的依赖项,需要重新启动。

提示

我个人进行跨环境更改的技巧是将Eclipse连接到两个Guvnor WebDav目录,并将规则签出到本地目录中,其中每个本地目录映射到一个环境。然后我使用Eclipse diff工具。

在构建Guvnor管理的知识库时,我创建了一个单独的Maven项目,该项目只包含事实,不依赖于任何其他内容。这样更容易保持它们的清洁。此外,当我确实需要添加依赖项时(即,在可能的情况下使用JodaTime),那么构建可以有一个步骤来生成一个包含所有依赖项的着色JAR。这样,您只需将一个JAR部署到Guvnor,它保证包含正确版本的依赖项。

我相信我会想到更多。我会尽量记住回到这里。。。

 类似资料:
  • 谢谢你的任何提示或帮助。

  • 目前我正在开发一个源代码到源代码的编译器,我已经编写了一个bison解析器,可以正确地为输入创建AST。我现在需要对语法树进行几个转换,因此我需要在树中插入许多节点。 我可以手动创建我想添加到语法树中的所有结构/联合,但这似乎是非常繁重的工作。 对我来说,创建一个字符串会容易得多,我希望这个字符串能被我已有的解析器解析。然后,解析器应该返回这个字符串的树,我可以将其插入到我的原始语法树中。 不幸的

  • 我想在Esper中编写一条规则,当过去15分钟内的步数为0且心率高于120时触发。我想出了以下规则: 我的心率类别有以下字段: 我的Steps类有以下字段: 我面临的问题是,我只想在过去15分钟内没有采取任何措施的情况下启动规则。现在,当两个步骤事件的步骤数相同时,它将激发。我知道我可能必须使用计时器。但是我不知道如何写这个规则。谁能帮帮我吗?

  • TL;DR:我需要在不同的文件中设置变量,可以通过jenkins管道自动更改。

  • 1、环境部署 下载下来后执行如下命令安装环境依赖 tnpm install 2、开发编译 所有模块源码均在src目录下 修改源码之后执行如下命令编译代码(gulpfile支持watch模式) gulp 产出文件位于build目录下 3、注意事项 严禁修改package.json中信息 严禁修改gulpfile工程逻辑 严禁增加publish tag 语法请遵循babel 使用箭头函数避免 self

  • 问题内容: 在进行Django 开发时,我倾向于使用SQLite,但是在实时服务器上,通常需要更强大的功能(例如MySQL / PostgreSQL)。同样,对Django设置也有其他更改:不同的日志记录位置/强度,媒体路径等。 你如何管理所有这些更改,以使部署变得简单,自动化? 问题答案: 如果你希望手动进行操作,则我先前的答案仍然适用: 我有多个设置文件。 -特定于主机的配置,例如数据库名称,