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
相关文章
|
边缘计算 JSON 物联网
解锁业务灵活性:RuleGo规则引擎的高效解耦与实时响应秘籍
RuleGo是一个基于Go语言的轻量级、高性能规则引擎,旨在通过动态规则链和组件化设计,简化复杂系统的业务逻辑管理和实时响应。
解锁业务灵活性:RuleGo规则引擎的高效解耦与实时响应秘籍
|
Java
规则引擎选型及应用
规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。 使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。
25107 0
|
前端开发 JavaScript Go
【golang之路】——govaluate
【golang之路】——govaluate
58553 5
【golang之路】——govaluate
|
1月前
|
XML 人工智能 JSON
阿里开源:skill-up,一款Agent Skill 评测工具!
阿里开源的 skill-up 是首个专为 Agent Skill 设计的评测与演进工具,将软件测试方法论完整迁移:支持多引擎运行、声明式 YAML 用例、规则/脚本/LLM 三类断言,并内置自动修复与回归闭环。本地可跑,CI 可集成,让 Skill 质量可度量、可保障。
836 1
阿里开源:skill-up,一款Agent Skill 评测工具!
|
11月前
|
运维 监控 供应链
Alibaba交易平台TMF2.0介绍
2017双11交易峰值达32.5万笔/秒,面对高并发与复杂业务需求,阿里推出TMF2.0框架,通过业务与平台分离、全链路可视化、配置化发布等创新,实现需求开发周期缩短至12天,支撑多业务快速试错与复用,构建可配置、可监控、可运维的电商技术新体系。
1509 5
Alibaba交易平台TMF2.0介绍
|
运维 监控 数据可视化
斩获6.1 star,再见Crontab!这款开源定时任务管理系统让运维更高效
Gocron是一款基于Go语言的轻量级定时任务调度系统,替代传统Linux Crontab。它提供可视化Web界面管理,支持秒级调度、任务依赖配置与多节点执行。核心功能包括:1) 可视化管理;2) 精确调度规则;3) 全链路任务控制;4) 多类型任务支持;5) 完善监控通知。适用于自动化运维、系统监控、数据处理及业务自动化等场景。通过三步快速上手:一键部署、添加任务节点、创建定时任务。相比Crontab和Celery,Gocron更直观高效,适合个人与企业使用。项目地址:https://github.com/ouqiang/gocron。
2448 8
|
SQL 存储 大数据
Flink 基础详解:大数据处理的强大引擎
Apache Flink 是一个分布式流批一体化的开源平台,专为大规模数据处理设计。它支持实时流处理和批处理,具有高吞吐量、低延迟特性。Flink 提供统一的编程抽象,简化大数据应用开发,并在流处理方面表现卓越,广泛应用于实时监控、金融交易分析等场景。其架构包括 JobManager、TaskManager 和 Client,支持并行度、水位线、时间语义等基础属性。Flink 还提供了丰富的算子、状态管理和容错机制,如检查点和 Savepoint,确保作业的可靠性和一致性。此外,Flink 支持 SQL 查询和 CDC 功能,实现实时数据捕获与同步,广泛应用于数据仓库和实时数据分析领域。
11798 42
|
Kubernetes Cloud Native 调度
《分布式任务调度框架深度对比:Quartz/XXL-JOB/Elastic-Job/PowerJob选型指南》​
根据IDC预测,到2025年全球将有75%的企业任务调度系统需要重构以适应云原生架构。技术雷达监测:定期关注CNCF技术趋势报告渐进式改造:从非核心业务开始验证新框架人才储备:重点培养具备K8s Operator开发能力的调度专家评估现有系统的云原生适配度在测试环境部署PowerJob 4.3.3参与CNCF调度技术社区讨论制定6个月框架迁移路线图(注:本文数据来自各框架官方路线图、CNCF年度报告及笔者压力测试结果,转载请保留出处)
3448 0
|
Linux C语言
Linux gcc升级全过程,过程超详细
Linux gcc升级全过程,过程超详细
8213 0
Linux gcc升级全过程,过程超详细
|
JSON 前端开发 JavaScript
Vite 共享配置
本文介绍了 Vite 配置中的 `base`、`mode`、`plugins`、`resolve` 和 `css` 等关键配置项。`base` 用于设置公共基础路径,`mode` 指定环境模式,默认为 `development` 和 `production`。`plugins` 注册项目中使用的插件。`resolve` 包含别名配置、去重依赖项和模块入口字段等选项。`css` 配置 CSS 预处理器及其选项,如导入样式变量文件。
585 6

热门文章

最新文章