本文概览:介绍go语言框架下开源规则引擎

1 引入

以一个电商运维场景为例,我们需要对用户注册年限p1、购买金额p2、地域p3等条件给用户进行发券,基于条件进行任意组合成不同规则。比如:

  • 规则1 :p1 > 2 && p2 > 10 000 & p3 in (‘beijng’,’shanghai’)  大于2年的老用户,并且购买金额大于10000的北京或上海用户。
  • 规则2: p1<1  小于1年的用户

为了解决这个问题,引入了规则引擎,从if …else中解放出来。Drools是java语言的规则引擎,本文是针对go语言的规则引擎框架。

Snip20201102_49

2 Go开源

先说结论:比较了govaluate、goengine、gorule,最终使用govaluate。相比 gorule、goengine,govaluate除了支持in操作、还支持正则表达式,而且表达式也不需要转换成DRL。

  • 支持string类型的 ==操作
  • 支持in操作
  • 支持计算逻辑表达式和算数表达式
  • 支持正则
框架 功能 基准测试
govaluate
https://github.com/Knetic/govaluate
Star: 1.4 k
1、直接使用表达式。不需要转IDL
2、支持算数表达式和逻辑表达式。
3、支持string的判断。
4、支持in 操作。

  • 1 in (1,2,3)
  • 字符串 in 。 ‘code1’ in (‘cod1′,’code2’)

5、支持正则

测试3个逻辑表达式条件,如下:
每次执行op需要15us
gengie(B站开源)
https://github.com/rencalo770/gengine
Star: 193
规则表达式类似于一个DRL。

规则脚本具有if..else等语法,后续支持扩展灵活。

grue

https://github.com/hyperjumptech/grule-rule-engine/
star:525

规则表达式需要生成生成一个 DRL。
https://github.com/dop251/goja

star:1.8k

go实现执行js脚本(类似于java 执行groovy )

这里不关注表达式,只是通过这引擎可以执行js脚本代码。

goja、gengine、grule都是基于脚本的,只是gojar是支持js,grule和gengine是自定义的语法脚本。

2.1 govaluate

demo代码,需要生成一个map传递变量的值。如下是计算算数公式和逻辑表达式例子。

2、基准测试

在测试go文件目录下执行:

测试结果如下,每次执行op需要15ms、9KB、需要内存分片次数140次。

 

2.2 goengine代码

demo如下:

 

2.3 gorule

demo如下:

 

2.4 goja

demo如下:

 

分类&标签