govaluate 规则引擎

简介: govaluate 规则引擎

前言

Drools是java语言的规则引擎,本文是针对go语言的规则引擎框架

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

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

为了解决这个问题,引入规则引擎, 从 if... else ...中解放出来。。

image.png

Go 规则引擎


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

  • 支持string类型的 ==操作
  • 支持in操作
  • 支持计算逻辑表达式和算数表达式
  • 支持正则

Go 规则引擎对比


框架 功能 基准测试
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是自定义的语法脚本。

govaluate


func TestGoValueate() {
   // 支持多个逻辑表达式
   expr, err := govaluate.NewEvaluableExpression("(10 > 0) && (2.1 == 2.1) && 'service is ok' == 'service is ok'" +
      " && 1 in (1,2) && 'code1' in ('code3','code2',1)")
   if err != nil {
      log.Fatal("syntax error:", err)
   }
   result, err := expr.Evaluate(nil)
   if err != nil {
      log.Fatal("evaluate error:", err)
   }
   fmt.Println(result)
   // 逻辑表达式包含变量
   expression, err := govaluate.NewEvaluableExpression("http_response_body == 'service is ok'")
   parameters := make(map[string]interface{}, 8)
   parameters["http_response_body"] = "service is ok"
   res, _ := expression.Evaluate(parameters)
   fmt.Println(res)
   // 算数表达式包含变量
   expression1, _ := govaluate.NewEvaluableExpression("requests_made * requests_succeeded / 100")
   parameters1 := make(map[string]interface{}, 8)
   parameters1["requests_made"] = 100
   parameters1["requests_succeeded"] = 80
   result1, _ := expression1.Evaluate(parameters1)
   fmt.Println(result1)
}


基准测试


func BenchmarkNewEvaluableExpression(b *testing.B) {
   for i := 0; i < b.N; i++ {
      _, err := govaluate.NewEvaluableExpression("(10 > 0) && (100 > 20) && 'code1' in ('code3','code2',1)")
      if err != nil {
         log.Fatal("syntax error:", err)
      }
   }
}
func BenchmarkEvaluate(b *testing.B) {
   parameters1 := make(map[string]interface{}, 8)
   parameters1["gmv"] = 100
   parameters1["customerId"] = "80"
   parameters1["stayLength"] = 20
   for i := 0; i < b.N; i++ {
      _, err := govaluate.NewEvaluableExpression("(gmv > 0) && (stayLength > 20) && customerId in ('80','code2','code3')")
      if err != nil {
         log.Fatal("syntax error:", err)
      }
   }
}


在 测试 go 文件目录下执行


go test -bench=. ./


或者


go test  -bench=.    -benchmem


测试结果


goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkNewEvaluableExpression-12         78542             14692 ns/op            8592 B/op        139 allocs/op
BenchmarkEvaluate-12                       77352             14884 ns/op
相关文章
|
Java
规则引擎选型及应用
规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。 使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。
24034 0
|
算法 Java JavaScript
规则引擎
我是阿里巴巴做规则引擎相关工作多年的java工程师一枚,本职工作就是通过规则引擎、规则管理平台等技术输出,来应对阿里巴巴复杂多变的上层规则相关业务的支持。限于技术保密、安全等因素,本文只讲一些个人对“规则引擎”的看法,欢迎大家一起探讨。
25954 1
|
消息中间件 存储 监控
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
|
存储 消息中间件 NoSQL
物联网数据通过规则引擎流转到OTS|学习笔记
快速学习物联网数据通过规则引擎流转到OTS
338 15
物联网数据通过规则引擎流转到OTS|学习笔记
1、Drools规则引擎-什么是规则引擎
### 什么是规则引擎 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件, 实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。 接受数据输入,解释业务规则,并根据业务规则做出业务决策。
515 0
1、Drools规则引擎-什么是规则引擎
|
存储 SQL 监控
规则引擎 | 学习笔记
快速学习 规则引擎
1419 0
规则引擎 | 学习笔记
EMQ
|
运维 监控 数据可视化
规则引擎集成新的可观测性框架
十月,EMQX在产品质量和用户体验方面进行了进一步提升;此外,EMQX Cloud在订阅渠道、部署地区、操作体验等方面均有更新。
EMQ
234 0
规则引擎集成新的可观测性框架
|
设计模式 数据挖掘
2、Drools规则引擎-为什么使用规则引擎
上文我们说过,规则引擎其实就是将if else全部给抽离出来了。但是这就是我们的规则引擎的全部内容吗?规则放在哪里都是放,为什么一定要拿规则引擎来抽离呢?肯定是规则引擎给我们解决了某些问题。本文主要讲的就是规则引擎是解决什么的方案
256 0
|
SQL 消息中间件 JavaScript
11-TDengine集成EMQX:通过规则引擎实现设备数据直接入库
11-TDengine集成EMQX:通过规则引擎实现设备数据直接入库
1104 0
11-TDengine集成EMQX:通过规则引擎实现设备数据直接入库
Drools规则引擎平台如何进行架构
Drools规则引擎平台如何进行架构
793 0
Drools规则引擎平台如何进行架构