规则引擎QLExpress和Drools的对比

2024-04-02 09:12

本文主要是介绍规则引擎QLExpress和Drools的对比,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QLExpress和Drools都是规则引擎,用于将业务逻辑以声明式的方式从应用程序代码中分离出来,便于业务规则的集中管理和灵活变更。

相同点

  1. 目的:

    两者都是为了实现业务规则的解耦,使得业务规则的编写、修改、测试和部署更加独立于应用系统的核心代码。

  2. 应用场景:

    QLExpress和Drools都适用于需要频繁调整业务规则、规则数量庞大、逻辑复杂多变的场景,如金融风控、保险理赔、优惠策略、工作流自动化等

  3. 规则管理: 二者均支持规则的版本控制、分组管理、生效/失效状态控制等,有助于企业进行规则的生命周期管理。

  4. 规则执行:

    都提供了规则执行引擎,能够根据输入的事实数据动态评估规则,并产生相应的决策结果。

区别

1.开发步骤

QLExpress开发步骤示意图:

+----------------+          +-------------------+
|                |          |                   |
|  编写QL脚本    | ---->    |  创建ExpressRunner |
|                |          |                   |
+----------------+          +-------------------+|                                  ||                                  v
+----------------+                      +----------------+
|                |                      |                |
|  创建Context   |                      |  执行规则脚本  |
|                |                      |                |
+----------------+                      +----------------+|                                  ||                                  v
+----------------+                      +----------------+
|                |                      |                |
|  设置上下文变量|                      |  获取执行结果  |
|                |                      |                |
+----------------+                      +----------------+
  1. 编写QL脚本:使用QLExpress的SQL-like语法编写规则脚本,如: Sql
    if (age > 18 && age < 60) then status = 'adult'; else status = 'non-adult';
  2. 创建ExpressRunner:实例化QLExpress的执行器ExpressRunner。
  3. 创建Context:创建DefaultContext实例,用于存储规则执行时的上下文数据。
  4. 设置上下文变量:在Context中设置规则所需的变量,如context.put(“age”, 25)。
  5. 执行规则脚本:调用ExpressRunner的execute方法,传入规则脚本和上下文,执行规则。
  6. 获取执行结果:从Context中获取规则执行后的结果,如String status = (String)
    context.get(“status”)。

Drools开发步骤示意图:

 +----------------+          +-------------------+|                |          |                   ||  编写DRL文件   | ---->    |  创建KieServices  ||                |          |                   |+----------------+          +-------------------+|                                  ||                                  v+----------------+                      +----------------+|                |                      |                ||  创建KieFileSystem |                  |  编译DRL文件   ||                |                      |                |+----------------+                      +----------------+|                                  ||                                  v+----------------+                      +----------------+|                |                      |                ||  创建KieContainer |                 |  创建KieSession ||                |                      |                |+----------------+                      +----------------+|                                  ||                                  v+----------------+                      +----------------+|                |                      |                ||  设置上下文数据 |                  |  执行规则      ||                |                      |                |+----------------+                      +----------------+|                                  ||                                  v+----------------+                      +----------------+|                |                      |                ||  获取执行结果  |                  |  关闭KieSession ||                |                      |                |+----------------+                      +----------------+
  1. 编写DRL文件:使用Drools的DRL语言编写规则文件,如: Drl

        when$person : Person(age > 18 && age < 60)thenmodify($person) { setStatus("adult") } end ```
    
  2. 创建KieServices:实例化Drools的工厂类KieServices。

  3. 创建KieFileSystem:使用KieServices创建KieFileSystem,并将DRL文件添加到文件系统中。

  4. 编译DRL文件:通过KieServices编译DRL文件,生成KieModule。

  5. 创建KieContainer:使用编译后的KieModule创建KieContainer,它是规则引擎的容器。

  6. 创建KieSession:从KieContainer中获取KieSession,它是规则执行的会话环境。

  7. 设置上下文数据:向KieSession插入事实(如Person对象),作为规则执行的上下文数据。

  8. 执行规则:调用KieSession的fireAllRules方法,执行规则。

  9. 获取执行结果:从KieSession中查询修改后的事实状态,或观察触发的事件,获取执行结果。

  10. 关闭KieSession:执行完毕后,关闭KieSession以释放资源。

在开发步骤方面,QLExpress流程更简洁,而Drools涉及到更多的对象创建和管理,但提供了更丰富的功能和更精细的控制。开发者应根据项目实际情况和团队技能选择合适的规则引擎,并遵循相应的开发步骤进行规则开发。

2.规则表达语言:

  • QLExpress:采用了一种类似于SQL的查询语言,语法简洁,易于理解,特别适合处理逻辑判断、数据查询和计算等任务。其语言特性更适合与数据库查询紧密结合的场景。
  • Drools:基于DRL(Drools RuleLanguage),这是一种专为Drools设计的领域特定语言(DSL),支持丰富的条件表达式、模式匹配、规则继承、聚合函数等高级特性,更适合表达复杂的业务规则和事件处理逻辑。

3.架构与功能:

  • QLExpress:通常更轻量级,专注于规则执行和查询能力,可能在复杂事件处理、工作流集成、决策表支持等方面功能相对较少。
  • Drools:作为一款全面的业务规则管理系统(BRMS),除了强大的规则引擎外,还包含了规则管理、决策表、决策树、流程编排(借助jBPM)、复杂事件处理(CEP)等丰富功能。Drools支持更为复杂的规则结构和更全面的业务场景。

4.社区与生态:

  • QLExpress:相对于Drools,QLExpress的社区活跃度和第三方支持可能较小,相关教程、插件、工具链等资源可能相对有限。
  • Drools:作为开源界知名的规则引擎,Drools拥有庞大的用户群体和活跃的开发者社区,有大量的文档、教程、示例、插件等资源,以及丰富的第三方集成和扩展支持。

5.企业级特性:

  • QLExpress:可能在企业级特性如审计日志、高性能集群部署、与其他企业级中间件的深度集成等方面不如Drools成熟和完善。
  • Drools:由于其源自JBoss(现Red
    Hat),具备较强的企业级基因,支持多种企业级特性,如详细的规则执行审计、高性能分布式部署、与Java EE生态系统的深度集成等。

6.执行性能

  1. QLExpress:

    QLExpress以其轻量级、专注于规则执行的特点,通常在处理简单规则、快速响应查询请求时表现出较好的性能。特别是当规则主要涉及逻辑判断、条件查询、数据计算等操作时,QLExpress的执行效率较高。

    由于QLExpress的规则语言与SQL相似,对于已经熟悉SQL的开发者而言,编写出高效查询的规则较为容易。同时,其简洁的语法和较小的运行时开销也对执行性能有一定正面影响。

  2. Drools:

    Drools作为一款功能全面的业务规则管理系统,其执行性能在处理复杂规则集、大规模数据流以及需要进行模式匹配、事件关联等高级操作时依然表现优秀。Drools基于RETE算法优化规则匹配过程,能够在大量规则和数据中快速定位匹配项。

    对于非常大规模的规则集和高并发场景,Drools支持分布式部署和集群模式,能够进一步提升执行性能和系统扩展性。但要注意,过于复杂的规则结构、不合理的规则组织或大量的规则冲突可能导致性能下降,需要合理设计规则和使用优化技巧。

QLExpress和Drools在执行性能上各有优势,选择哪一种取决于具体业务需求和数据规模。

7.入手难易程度:

  • QLExpress:

    对于熟悉SQL的开发者来说,QLExpress的语法较为亲切,学习曲线相对较平缓。其简洁的语法和聚焦于规则执行的特点,使得初学者能够较快地掌握基本用法并应用于实际项目中。

  • Drools:

    Drools提供了更丰富、更复杂的规则表达能力,但这也意味着学习成本相对较高。开发者需要理解DRL语言的细节、规则文件结构、规则执行流程等概念。尽管有丰富的学习资源,但全面掌握Drools并有效运用其高级特性的门槛相对较高。

综上所述,QLExpress和Drools在规则引擎的核心功能上存在共性,但在规则表达语言、功能完备性、社区生态及企业级特性上有所差异。QLExpress更偏向轻量、易学、与数据库查询紧密相关的场景,而Drools则提供了更强大、全面的功能和企业级支持,适用于复杂业务规则管理和大规模项目。因此,选择哪一个取决于具体项目的业务需求、技术栈、团队技能及长期维护计划等因素。

这篇关于规则引擎QLExpress和Drools的对比的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869570

相关文章

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

Smarty模板引擎工作机制(一)

深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: <?php$title="深处浅出之Smarty模板引擎工作机制";$content=

类的load方法和initialize方法对比

1. load方法在main()之前被调用,而initialize方法在main()之后调用 load方法实际是在load_images过程中被调用的。load_images会将当前应用依赖的所有镜像(动态库)加载到内存,在在加载中首先是对镜像进行扫描,将所有包含 load 方法的类加入列表 loadable_classes ,然后从这个列表中逐一调用其所包含的 load 方法。 +[XXCl

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

【HarmonyOS】-TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。 TaskPool与Worker工作原理 TaskPool与Worker两种多线程并发能力均是基于 Actor并发模型实现的。Worker主、子线程通过收发消息进行通信;TaskPool基于Worker做了更多场景化的功能封装,例

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能