0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

规则引擎深度对比,LiteFlow vs Drools!

jf_ro2CN3Fa 来源:稀土掘金 2023-04-20 18:02 次阅读

Drools是一款老牌的java规则引擎框架,早在十几年前,我刚工作的时候,曾在一家第三方支付企业工作。在核心的支付路由层面我记得就是用Drools来做的。

难能可贵的是,Drools这个项目在十几年后还依旧保持着开源和更新。

而LiteFlow也是一款java规则引擎,于2020年开源。经过2年的迭代,现在功能和特性也非常棒,很适合用在高复杂度的核心业务上,同时又能保持业务的灵活性。

这篇文章我们就来深入比较下这两款框架,都适合用在什么样的场景,有什么异同点,以及在相同的场景下表现力如何。

(其中Drools基于7.6.0版本,LiteFlow基于2.9.0版本)

虽然题主就是开源项目LiteFlow的作者,但是我这几天也深入了解了下Drools,尽量从很客观的角度尝试去分析。很多比对的结果都是基于实际使用后的感受。不过题主难免会带有一些主观的心理以及了解的片面性,尤其是Drools现在已经更新到了8.X。

规则引擎的定义

首先我想明确下规则引擎的定义,因为很多小伙伴容易把规则引擎和流程引擎的概念混在一起。

规则引擎通常是嵌入在应用程序组件中的,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

简单来说就是,规则引擎主要解决易变逻辑和业务耦合的问题,规则驱动逻辑。以前项目内写死在代码里的逻辑用规则引擎可以提出来,随时热变更。

而流程引擎实现了将多个业务参与者之间按照某种预定义的规则进行流转,通常需要涉及到角色信息

简单来说就是,流程引擎主要解决业务在不同角色之间的流转问题,如请假流程,审批流程,往往要经过多个角色。规则驱动角色流转。

两款框架的异同点

Drools和LiteFlow都是优秀的开源框架,都能把业务中的逻辑给剥离出来。并且拥有自己表达式语法。

但是有所区别的是,Drools强调逻辑的片段规则化,你可以把核心易变部分写成一个规则文件,等同于原先写在java里的代码现在搬迁到了规则文件。规则文件里的代码全都是可以热变更的。

而LiteFlow是基于组件式的思想设计的,更强调组件的规则化,覆盖范围是整个业务。编排的最小单位是组件,规则文件用来串联组件间的流转。同时LiteFlow也支持片段式的代码规则化,因为LiteFlow也支持业务逻辑的脚本化。规则支持热变更。

所以评判一个规则引擎是否合格的主要因素有:

有没有灵活的规则表达式来支持

规则和Java之间能否非常方便的联动

API调用是否方便,和各种场景系统的集成如何

侵入性耦合比较

规则的学习成本,是否容易上手

规则表达式是否有语言插件

规则能否和业务松耦合,存储于其他地方

规则的变更能否实时改变逻辑

是否有界面形态来支持非技术人员的使用

框架的性能表现

下面就从这几个方面来细细比较两款框架的表现力

规则表达式

Drools的规则表达式为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。

Drools的规则表达式贴近自然编程语言,拥有自己的扩展名文件drl,语法支持全,基本上自然编程语言有的语法drl全有。所以,完全可以把java的逻辑写在drl文件中。

来看下drl文件的大体样子:

5e44964e-d5c2-11ed-bfe3-dac502259ad0.jpg

drl文件

可以看到,Drools定义规则的方式是一个规则一段,有明确的when...then,表示当满足什么条件时,做什么。关注公z号:码猿技术专栏,回复关键词:1111 获取阿里内部Java性能优化手册!在触发规则时候,会自动判断该去执行哪一段rule,如果满足多个条件,是可以触发多个规则的then的。

LiteFlow编排表达式简单易懂,底层用EL表达式语言包装而成。用于组件的流转,支持异步,选择,条件,循环,嵌套等一些场景。

组件层面不仅可以是java组件,还可以用脚本语言来编写,目前支持了Groovy和QLExpress两种脚本语言。所有能用java实现的,用脚本语言都可以做到。

LiteFlow的规则文件大体长这个样子:

5e619366-d5c2-11ed-bfe3-dac502259ad0.jpg

LiteFlow的规则文件

上述LiteFlow的编排表达式中,所表达的是下面一个逻辑流:

5e73973c-d5c2-11ed-bfe3-dac502259ad0.jpg

LiteFlow的编排表达式

LiteFlow编排表达式支持THEN(同步),WHEN(异步),SWITCH(选择),IF(条件),FOR(次数循环),WHILE(条件循环)等大表达式,每个表达式又有许多扩展关键字可供选用。

脚本组件支持的Groovy基本和java语法差不多,Groovy语言支持的一切你均可使用。甚至可以在Groovy语法中额外定义类和方法。

「结论」

总的来说,两款框架都能用脚本来定义逻辑片段,在定义逻辑片段层面,Drools使用的是自研语法,LiteFlow使用的是插件式的Groovy,其实个人觉得Groovy更接近java语法,你甚至于可以在其中定义类和方法。Drools在高级应用中,也可以用规则定义方法,但是我觉得并不那么自然。

LiteFlow最大的特点是除了定义逻辑片段外,还可以进行全局组件的编排。而这正是LiteFlow称之为编排式规则引擎的由来。使用简单的编排语法可以设计出复杂的逻辑流。支持java和脚本混编。

和Java的数据交换

在Drools的规则中,你可以通过import关键字来引入java的一些类包类进行调用。

在LiteFlow的脚本组件中,Groovy也可以通过import 来引入java的任何包来调用。

Drools中,可以直接引用到fact对象。

LiteFlow中,可以直接引用到context对象,context上下文贯穿整个编排链路。

LiteFlow中,通过@ScriptBean注解,你甚至可以把spring上下文中的bean引入进来直接调用。利用这个特性,甚至于可以在脚本中调用rpc,调用数据库dao对象取数据。这个在Drools里面虽然也可以做到,但是要麻烦的多。

「结论」

基本都能满足和java的数据交换需求,但是LiteFlow在场景上支持的显然更加多一点。

API以及集成

在API调用层面,Drools需要去定义KieContainer,KBase,KSession一系列对象。LiteFlow框架只需要使用到LiteFlowExecutor对象。

Drools支持了编程式接入,但是在springboot中需要自己写很多配置类来去集成。

LiteFlow不仅支持了编程式接入,在springboot环境下更是提供了自动装配的starer接入方式,连定义LiteFlowExecutor都不需要,直接从上下文中就可以拿到自动装配后的对象进行调用。

结论

LiteFlow api更加简单,同Springboot集成度更加高。

侵入性耦合比较

Drools需要在java代码里需要用到规则的地方用KSession对象去匹配规则进行调用。规则和java是分离的。在调用层面耦合了KSession调用对象。

LiteFlow的规则和java也是分离的,但是LiteFlow多了组件这一概念,所以在组件层面是需要继承的,但是同时也提供声明式组件的选择,使用声明式的方式耦合相对要减少一些。在调用层面也需要去调用LiteFlowExecutor对象。

「结论」

在耦合度上面,由于LiteFlow提供编排特性,API耦合度相对稍高一些。Drools耦合少一些。

规则的学习成本

Drools的规则学习成本挺高的。由于是自研的规则语法,需要一个很全面的熟悉过程。而且文档全英文。

LiteFlow的编排规则极其简单,如果你不使用脚本组件的话,基本上10分钟即可上手。就算使用了groovy脚本,由于groovy非常类似于java,学习成本也非常少。况且有大量的学习资料可以参阅。

LiteFlow的文档中英文齐全,还有良好的中文社区可以答疑解惑。

结论

在规则学习成本上,Drools的规则学习曲线比LiteFlow高出不止一丁点。

是否有语言插件

Drools在Eclipse和IDEA上均有插件来做语法的高亮,预检查和提示。

LiteFlow在IDEA上有插件来做高亮,预检查和提示。Eclipse上没有。

结论

考虑到使用eclipse的人几乎很少了,基本上2款规则引擎在语言插件上都做到了。

规则的存储

Drools的规则理论上支持你的规则存于任何地方,但这一切都需要你手动去额外完成。自己去存,自己去取。

Drools还有款workbeanch的插件,可以将规则存于workbeanch中。只有这个是不需要自己存取的。

LiteFlow除了本地规则以外,原生支持将规则存储于任何标准SQL的数据库,还原生支持了Nacos,Etcd,zookeeper等注册中心。只需要配置一下即可。除此之外,还提供了扩展接口,方便你自己扩展成任意的存储点。

「结论」

LiteFlow的规则存储支持比Drools丰富的多。

规则的变更能否实时改变逻辑

Drools热刷新规则的方式现在看起来有点傻,它的规则是通过生成jar的方式。然后系统远程动态读取jar包来完成规则刷新的。

而且一定得通过workbench的方式进行规则的热变更。

LiteFlow在这个层面做的高级很多。如果你是用Nacos,Etcd,zookeeper等方式存储,不用做任何事,改变即自动刷新。如果你是SQL数据库存储,或者本地存储。在改变规则之后,需要调用LiteFlow框架提供的一个API进行热变更。2种方式均可热更新。并且在高并发情况下是平滑的。

「结论」

LiteFlow在热更新设计层面比Drools先进很多。

是否有界面形态来支持

Drools有workbench,workbench是一个独立的插件包,提供了web界面编写规则以及fact对象。并提供了检查和部署的能力。但因为Drools主要关心逻辑片段,并不需要提供编排层面的拖拽UI功能,只是提供了在界面上编写规则的能力。

LiteFlow并没有界面形态。目前只能通过第三方的Nacos,Etcd提供的界面来辅助完成界面的规则修改。

「结论」

Drools在UI形态生态上领先LiteFlow一截。

框架的性能表现

这里用Drools和LiteFlow实现了同样的一段逻辑Demo。

根据订单金额来加积分的Demo案例。

案例逻辑很简单,根据订单的金额来动态判断该加多少积分:

小于100元,不加积分。

100到500元,加100积分。

500到1000元,加500积分。

1000元以上,加1000积分。

其中Drools的规则如下:

packagerules;

importcom.example.droolsdemo.entity.Order;

rule"score_1"
when
$order:Order(amount<100)
then
    $order.setScore(0);
    System.out.println("触发了规则1");
end

rule "score_2"
when
    $order:Order(amount>=100&&amount< 500)
then
    $order.setScore(100);
    System.out.println("触发了规则2");
end

rule "score_3"
when
    $order:Order(amount>=500&&amount< 1000)
then
    $order.setScore(500);
    System.out.println("触发了规则3");
end

rule "score_4"
when
    $order:Order(amount>=1000)
then
$order.setScore(1000);
System.out.println("触发了规则4");
end

其中等价的LiteFlow规则如下:





=100&&amount< 500){
                    return "b";
                }else if(amount >=500&&amount< 1000){
                    return "c";
                }else{
                    return "d";
                }
            ]]>




















SWITCH(w).TO(a,b,c,d);


两款框架都全用脚本来写的情况下,测试的过程中,去除所有的打印日志,执行10w次,得到的结果如下:

Drools 执行10w次,耗时0.7秒

LiteFlow全脚本组件执行10w次,耗时3.6秒

由于LiteFlow在全脚本组件的情况下,需要做脚本的执行和编排脚本的执行,所以花费的时间更长。

如果LiteFlow把组件更换成java,再进行执行,得到的结果如下:

LiteFlow 全Java组件执行10w次,耗时0.5秒

结论

如果LiteFlow采用全脚本的方式运行,耗时会比Drools更长。如果采用全java组件的方式运行,其性能能超越Drools一点。

所以对于LiteFlow而言,如果你希望更高的性能,则采用java组件,如果你希望更高的灵活性,则采用脚本组件。

其实在实际业务中,把容易更改的逻辑抽出来写成脚本组件,采用java+脚本混编的方式,是更为推荐的做法。

结语

为什么会拿Drools来作为比较,其一在题主心中,Drools一直是规则引擎界的标杆,drools有很多理念非常值得学习。其二也是因为题主也只熟悉Drools,其他的框架没有很好的使用过的缘故。

但是综合来看,作为国产规则引擎后起之秀LiteFlow显然在设计理念,支持度方面是要优于Drools的。编排式规则引擎作为规则引擎的一个新的方向,也会一直探索下去的。希望大家能多多支持这款国产的规则引擎。在编排方向,LiteFlow除了文中所提到的一些特性以外,还有很多其他各种各样的探索性的玩法和高级特性。是一款很值得深挖的框架。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2954

    浏览量

    104511
  • RPC
    RPC
    +关注

    关注

    0

    文章

    111

    浏览量

    11502
  • 编程语言
    +关注

    关注

    10

    文章

    1936

    浏览量

    34573
  • API接口
    +关注

    关注

    1

    文章

    82

    浏览量

    10421

原文标题:规则引擎深度对比,LiteFlow vs Drools!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    中科创达与火山引擎达成深度合作

    近日,中科创达与火山引擎在成都盛美利亚酒店隆重举行深度合作签署仪式。火山引擎汽车行业总经理杨立伟、中科创达执行总裁常衡生见证签约,火山引擎汽车出行战略客户总经理梁民忞、中科创达副总裁兼
    的头像 发表于 11-04 14:34 189次阅读

    了解Davinci预览引擎

    电子发烧友网站提供《了解Davinci预览引擎.pdf》资料免费下载
    发表于 10-15 09:56 0次下载
    了解Davinci预览<b class='flag-5'>引擎</b>

    网关的设置规则

    网关的设置规则涉及多个方面,包括硬件安装、网络连接、基本配置、高级配置以及安全设置等。以下是一篇关于网关设置规则的详细指南,旨在帮助用户正确配置和管理网关设备。
    的头像 发表于 09-30 11:48 1082次阅读

    VS高精度电压传感器

            VS系列电压传感器是一种量程覆盖35kV及以下的直流、交流、周期性脉冲以及各种不规则波形的电压传感器,精度高达0.05%FS、带宽高达100kHz,可满足宽频带、高精度电压测试需求
    的头像 发表于 09-19 15:55 268次阅读
    <b class='flag-5'>VS</b>高精度电压传感器

    Java表达式引擎选型调研分析

    1 简介 我们项目组主要负责面向企业客户的业务系统, 企业的需求往往是多样化且复杂的,对接不同企业时会有不同的定制化的业务模型和流程。 我们在业务系统中 使用表达式引擎,集中配置管理业务规则,并实现
    的头像 发表于 08-15 14:25 300次阅读
    Java表达式<b class='flag-5'>引擎</b>选型调研分析

    AI入门之深度学习:基本概念篇

    1、什么是深度学习 1.1、机器学习    图1:计算机有效工作的常用方法:程序员编写规则(程序),计算机遵循这些规则将输入数据转换为适当的答案。这一方法被称为符号主义人工智能,适合用来解决定
    的头像 发表于 08-08 11:24 1850次阅读
    AI入门之<b class='flag-5'>深度</b>学习:基本概念篇

    深度学习编译器和推理引擎的区别

    深度学习编译器和推理引擎在人工智能领域中都扮演着至关重要的角色,但它们各自的功能、应用场景以及优化目标等方面存在显著的差异。以下是对两者区别的详细探讨。
    的头像 发表于 07-17 18:12 1183次阅读

    深度学习与传统机器学习的对比

    在人工智能的浪潮中,机器学习和深度学习无疑是两大核心驱动力。它们各自以其独特的方式推动着技术的进步,为众多领域带来了革命性的变化。然而,尽管它们都属于机器学习的范畴,但深度学习和传统机器学习在方法、应用、优势等方面却存在显著的差异。本文将对这两者进行深入的
    的头像 发表于 07-01 11:40 1152次阅读

    火山引擎与南开大学深化合作签约,携手共建“AI+教育”新生态

    近日,在2024春季火山引擎FORCE原动力大会实体产业及教科研专场上,南开大学与火山引擎成功举办了深度合作签约仪式。此次合作标志着双方将携手共筑“AI+教育”的新篇章,共同推动教育行业数字化转型。
    的头像 发表于 05-20 11:16 570次阅读

    银河电气VS系列电压传感器介绍

    VS系列电压传感器是一种量程覆盖10kV及以下的直流、交流、周期性脉冲以及各种不规则波形的电压传感器,精度高达0.05%FS、带宽高达200kHz,可满足宽频带、高精度电压测试需求。 银河电气VS
    的头像 发表于 05-09 13:25 384次阅读
    银河电气<b class='flag-5'>VS</b>系列电压传感器介绍

    VS Code和VS Codium之间的区别有哪些?你选哪个?

    VS Codium 是一个 VS Code 的克隆版本,百分之百免费且开源。
    的头像 发表于 02-23 15:28 1510次阅读
    <b class='flag-5'>VS</b> Code和<b class='flag-5'>VS</b> Codium之间的区别有哪些?你选哪个?

    如何优化 PCB 布线规则

    本文要点在PCB布线中不使用规则可能会出现的问题。设计中可使用的不同类型PCB布线规则。如何在PCB布线中应用规则和约束。“限制”一词通常具有负面色彩,会引起人们的警惕。但实际上,对于整体的正向发展
    的头像 发表于 02-19 13:00 1156次阅读
    如何优化 PCB 布线<b class='flag-5'>规则</b>?

    vs1053模块怎么接喇叭

    VS1053模块是一种音频解码芯片,可用于播放音频文件。它具有多种接口选项,包括I2S,SPI和UART。要连接喇叭到VS1053模块,你需要以下几个步骤。 第一步是选择合适的喇叭。喇叭有多种
    的头像 发表于 01-03 17:45 2110次阅读

    了解SiC器件的命名规则

    了解SiC器件的命名规则
    的头像 发表于 11-27 17:14 793次阅读
    了解SiC器件的命名<b class='flag-5'>规则</b>

    英飞凌IGBT模块命名规则

    英飞凌IGBT模块命名规则
    的头像 发表于 11-23 09:09 1550次阅读
    英飞凌IGBT模块命名<b class='flag-5'>规则</b>