规则联动引擎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设备上。官方开源的引警实现分为两种,分别由RustGo语言实现。除此之外,还提供了nodejspython的引擎接口(二者底层基于Rust引擎提供的动态库)。相对比与其他的低代码数据处理平台,GoRules的优势是执行高效,更适合嵌入式设备的使用。

### 规则引擎在多租户体系中的数据隔离方案 #### 1. **规则引擎的作用** 规则引擎作为一种高效的业务逻辑处理工具,能够在多租户环境中动态解析和执行复杂的规则集合。它可以通过定义一系列条件与动作的组合来实现数据隔离[^1]。例如,当某个请求到达时,规则引擎会根据预设的规则评估该请求是否合法,并进一步决定哪些数据可以被访问。 #### 2. **基于规则引擎的数据隔离方法** ##### (a) **租户标识符匹配** 每条进入系统的查询都需要附带一个唯一的租户标识符(Tenant ID)。规则引擎可以根据这个标识符筛选出符合条件的数据记录。如果某条记录所属的租户编号与当前请求者不符,则直接忽略这条记录[^1]。 ```python def filter_data_by_tenant(data_list, tenant_id): filtered_data = [] for record in data_list: if record['tenant_id'] == tenant_id and evaluate_rule(record): # 调用额外规则校验函数 filtered_data.append(record) return filtered_data def evaluate_rule(record): """模拟简单规则评估""" conditions_met = True # 添加更多复杂规则... return conditions_met ``` ##### (b) **字段级别过滤** 对于采用表隔离策略的情况,虽然所有租户共用一张表格,但是每一行都会附加一个表示归属哪个租户的特殊列(如 `tenant_id` 字段)。此时,规则引擎不仅负责验证整体权限,还可以深入到具体的字段层次实施更精细的控制措施。 ##### (c) **跨层联动检查** 数据库层面固然提供了初步防护屏障,但在实际应用场景下还需要结合前端界面显示、API接口调用等多种因素综合考量。因此,利用规则引擎串联起从前端输入验证直至后台持久化保存全过程显得尤为重要[^2]。 #### 3. **案例分析:Hadoop生态系统下的多租户管理实践** 在大规模分布式计算框架 Hadoop 上构建多租户架构时,除了基本的文件系统分区外,还需引入 YARN 的队列管理和 Fair Scheduler 政策以确保各类作业间互不影响。与此同时,借助 Oozie 工作流调度器配合自定义开发的规则插件,便能达成更为精确的任务排队顺序安排以及优先级调整目标[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值