五大常用规则引擎简介

1、规则引擎是什么

       在很多企业的 IT 业务系统中,会有大量的业务规则配置,而且随着企业管理者的决策变化,这些业务规则也会随之发生更改。为了适应这样的需求,我们的 IT 业务系统应该能快速且低成本的更新。一般的作法是将业务规则的配置单独拿出来,使之与业务系统保持低耦合,规则引擎通过接受输入的数据,进行业务规则的评估,并做出业务决策。

五大常用规则引擎简介_第1张图片

       配合规则引擎提供的业务规则设计器,不用编码就可以快速实现复杂的业务规则,并且,规则集中管理,可提高业务规则的可重用性。决策结果的积累和回溯,可以反向推动规则的迭代优化,帮助组织形成一个不断演进的商业智能分析知识库。常见的规则引擎大体上分为两种:

  • 重量级:组件齐全,提供整套解决方案,以Drools为代表。
  • 轻量级:本质上是一种基于JVM的脚本语言,只负责脚本的编译、执行,规则的定义、运维等要结合具体的业务自己开发,以Groovy、AviatorScript、QLExpress、MVEL等为代表。

2、重量级规则引擎

     Drools 是用 Java 语言编写的开源规则引擎,基于Rete算法实现,是KIE项目的一部分,兼容JSR 94 。它是基于以下几个抽象组件来实现的:规则(Rules)、事实(Facts)、生产内存、工作内存、议程等。规则以脚本的形式存储在一个文件中,使规则的变化不需要修改代码,重新启动机器即可在线上环境中生效。

五大常用规则引擎简介_第2张图片

       如果只使用规则的执行,引入BRE就够了,编写Java代码和规则文件即可。如果要编排很复杂的工程,则需要用到BRMS整套解决方案了,包括BRE、Drools Workbench、DMN等。我们说Drools太重了,主要是在说:

  • Drools相关组件比较多,需要逐个研究才知道是否需要
  • Drools逻辑复杂,不了解原理,一旦出现问题排查难度高
  • Drools需要编写规则文件,学习成本高

3、轻量级规则引擎

3.1 Groovy

       Groovy是Apache 旗下的一种基于JVM的面向对象编程语言,也可以用作纯粹的脚本语言。在语言的设计上它吸纳了Python、Ruby 等脚本语言的优秀特性,比如动态类型转换、闭包和元编程支持等。Groovy和Java代码的最大区别在于Groovy更灵活,语法要求更少,学习成本很低,因此吸引了许多Java使用者。另外,Groovy可以无缝集成所有已经存在的 Java 对象和类库,直接编译成 JVM 字节码,这样可以在任何使用 Java 的地方使用 Groovy 。

五大常用规则引擎简介_第3张图片

      Groovy 是一门动态语言,显式支持运行时编译和动态加载可以在运行时扩展程序。Groovy还支持将.groovy源代码编译成.class字节码文件(预编译模式),同时又支持在运行时加载并编译.groovy源文件(直接调用模式)。那么 Groovy 是如何实现这一切的呢?

       其实这一切都要归功于 Groovy 编译器,Groovy 编译器在编译 Groovy 代码的时候,并不是像 Java 一样,直接编译成字节码,而是编译成 “动态调用的字节码”。不过,由于每次执行的时候,都会新生成一个class文件,这样就会导致JVM的perm区或Metaspace持续增长,进而导致FullGC问题,解决办法就是脚本文件变化了之后才去创建文件,之前从缓存中获取即可。

3.2 AviatorScript

      AviatorScript是阿里开源的一个高性能、轻量级的Java语言实现的表达式求值引擎,支持运算符重载,原生支持大整数和 BigDecimal 类型及运算,支持正则表达式类型及匹配运算符。可以将表达式直接翻译成对应的 Java 字节码执行,这样就保证了它的性能超越绝大部分解释性的表达式引擎。其主要有以下几个特性:

五大常用规则引擎简介_第4张图片

1.高性能:Aviator的基本执行过程是将表达式直接翻译成对应的 java 字节码执行,整个过程最多扫两趟,这样就保证了它的性能超越绝大部分解释性的表达式引擎。

2.轻量级:Aviator 除了依赖 commons-beanutils 这个库之外不依赖任何第三方库,因此,整体非常轻量级,整个 jar 包大小哪怕发展到 5.0 这个大版本,也才 430K。

3.开放能力强:Aviator 内置的函数库非常“节制”,除了必须的字符串处理、数学函数和集合处理之外,类似文件 IO、网络等等你都是没法使用的,这样便能有效保证 Aviator 运行期的安全。如果你需要更多的高阶能力,是可以通过开放的自定义函数来接入以及各种定制选项。

4.开发量少:Aviator 与脚本语言类似,使用表达式引擎也需要自行实现规则的组合和决策流的编排等功能,不过由于表达式的运行比较易于控制,所以 Aviator 减少了不少的基础开发工作。

       从 5.3 版本开始,AviatorScript还支持了解释执行模式,这种模式下,将生成 AviatorScript 自身设计的指令并解释执行,这样就不依赖 asm,也不会生成字节码,在 Android 等非标准 Java 平台上就可以运行。

五大常用规则引擎简介_第5张图片

3.3 QLExpress

       QLExpress由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:

  • 高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和Groovy性能相当;
  • 弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强;
  • 安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况;
  • 代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。

       QLExpressRunner如下图所示,从语法树分析、上下文、执行过程三个方面提供二次定制的功能扩展。五大常用规则引擎简介_第6张图片

3.4 MVEL

       MVEL为 MVFLEX Expression Language的缩写,是一种基于Java语法,可嵌入的表达式语言,MVEL简单说就是一种表达式解析器。我们可以自己写一些表达式,交给MVEL进行解析计算,得到这个表达式计算的值。MVEL可以用来解析复杂的JavaBean表达式,还可以方便地调用java的类,函数等。Java Runtime(运行时)允许MVEL表达式通过解释执行或者预编译执行。

其具有以下特性:

  • 动态JIT优化器。当负载超过一个确保代码产生的阈值时,选择性地产生字节代码,这大大减少了内存的使用量。
  • 新的静态类型检查和属性支持,允许集成类型安全表达。
  • 新的脚本语言特征。MVEL2.0 包含函数定义,如:闭包,lambda定义,标准循环构造(for, while, do-while, do-until…),空值安全导航操作,内联with-context运营 ,易变的(isdef)的测试运营等等。
  • 更快的模板引擎,支持线性模板定义,宏定义和个性化标记定义。

Drools当中就集成了MVEL,用于动态代码的生成。

五大常用规则引擎简介_第7张图片

     

      上面便是几个常见的轻重量级规则引擎,大家可以根据需求进行相应的选择,更多了解请看规则引擎专题,立即使用。

你可能感兴趣的:(python,开发语言)