当前位置: 首页 > article >正文

规则联动引擎GoRules初探

背景说明

嵌入式设备随着物联网在生活和生产中不断渗透而渐渐多起来,数据的采集、处理、分析在设备侧的自定义配置越来越重要。一个可通过图形化配置的数据处理过程,对于加速嵌入式设备的功能开发愈发重要。作为一个嵌入式软件从业者,笔者一直在寻找合适的、低代码的规则联动软件。之后发现了GoRules开源项目,上周日经过尝试,编译通过了官方文档中的示例,借此机会对这一规则引擎做简要的说明。

图形化绘制决策表

GoRules的规则文件由编辑器绘制成,保存后可下载JSON格式的规则文件。注意到,该在线编辑器由nodejs编写,有需要的也可以部署到本地。GoRules开源项目提供了规则表的在线编辑器:https://editor.gorules.io/。可以通过上传此处的一个table.json文件,查看官方引擎代码提供的一个规则:

规则编辑界面
之后可点击Hello下面的Edit Table,我们对默认的决策表进行简单的修改,修改后结果如下:

修改决策表
如上,当input大于10时,会输出input + (input / 2)的值。其他情况默认输出0。之后依次点击保存、下载图标,即可得到新的规则文件table.json

运行GoRules的规则文件

GoRules的官方文档给出了一个基于Rust的演示示例,但笔者花了一个多月的时间才找到与示例对应的jdm_graph.json(即上面提到的table.json规则文件):

use serde_json::json;
use zen_engine::DecisionEngine;
use zen_engine::model::DecisionContent;async fn evaluate() {let decision_content: DecisionContent = serde_json::from_str(include_str!("jdm_graph.json")).unwrap();let engine = DecisionEngine::default();let decision = engine.create_decision(decision_content.into());let result = decision.evaluate(&json!({ "input": 12 })).await;
}

对上面的演示代码进行必要的修改才能运行:

use serde_json::json;
use zen_engine::DecisionEngine;
use zen_engine::model::DecisionContent;#[tokio::main]
async fn main() {let decision_content: DecisionContent = serde_json::from_str(include_str!("table.json")).unwrap();let engine = DecisionEngine::default();let decision = engine.create_decision(decision_content.into());let result = decision.evaluate((&json!({ "input": 3 })).into()).await;println!("Evaluation result: {:?}", result);let result = decision.evaluate((&json!({ "input": 12 })).into()).await;println!("Evaluation result: {:?}", result);
}

可以看到,为了验证上面table.json中的规则,这里给了input两个值。编译后运行结果如下:

Evaluation result: Ok(DecisionGraphResponse { performance: "230.5µs", result: {"output":0}, trace: None })
Evaluation result: Ok(DecisionGraphResponse { performance: "40.6µs", result: {"output":18}, trace: None })

至此,可以确定自定义绘制的规则的运行结果符合预期了。

GoRules引擎说明

GoRules开源项目定义了一套可执行的表达式语言,称为Zen-Expression-Language。规则文件虽是JSON格式的,但在规则加载过程中会被“编译”为Zen表达式语言,以加速规则的执行效率。GoRules虽常用于服务器上面的数据处理,也可用在嵌入式Linux设备上。官方开源的引警实现分为两种,分别由Rust和Go语言实现。除此之外,还提供了nodejspython的引擎接口(二者底层基于Rust引擎提供的动态库)。相对比与其他的低代码数据处理平台,GoRules的优势是执行高效,更适合嵌入式设备的使用。

http://www.lryc.cn/news/2379179.html

相关文章:

  • 基于OpenCV中的图像拼接方法详解
  • AI大模型学习二十六、使用 Dify + awesome-digital-human-live2d + ollama + ChatTTS打造数字人
  • HTML-3.2 表格的跨行跨列(课表制作实例)
  • Spring Cloud Sentinel 快速入门与生产实践指南
  • 系统架构设计(十):结构化编程
  • 标准差和方差是什么
  • 【周输入】510周阅读推荐-3
  • Android平台GB28181设备接入与功能支持详解
  • mvc-ioc实现
  • Windows 11 C:\Windows\Web\Wallpaper
  • 医疗信息系统安全防护体系的深度构建与理论实践融合
  • Compose笔记(二十五)--Brush
  • Spring Web MVC————入门(3)
  • HTML 属性详解
  • NC61 两数之和【牛客网】
  • Java生成可控的Word表格功能开发
  • Node.js中的洋葱模型
  • Spring Boot 中 MyBatis 与 Spring Data JPA 的对比介绍
  • 如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践
  • 如何实现RTSP和RTMP低至100-200ms的延迟:直播SDK的技术突破
  • symfonos: 2靶场
  • 【图像生成大模型】Step-Video-T2V:下一代文本到视频生成技术
  • C语言中的指针:从基础到进阶实战
  • 深度学习推理引擎---ONNX Runtime
  • JAVA Spring MVC+Mybatis Spring MVC的工作流程*,多表连查
  • ctr查看镜像
  • VueUse/Core:提升Vue开发效率的实用工具库
  • 数字格式化库 accounting.js的使用说明
  • ​Docker 网络
  • 【论文阅读】A Survey on Multimodal Large Language Models