ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现

Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现 一、规则引擎是什么规则引擎简单说是给业务逻辑提供一种专门的表达语言而不用每次用代码重写一遍。物联网的场景联动就是规则引擎最常见的一种形态一段规则 触发器什么时候开始 条件满足什么判断 动作做什么事。比如触发器设备上报温度device-report条件温度 30℃动作发一条告警短信、给设备下一条指令。这样的场景在物联网里随处可见空调温度联动、设备离线告警、电表定时上报、门磁触发摄像头抓拍、无人值守设备异常停机保护…… 它们数量庞大、规则各不相同、还随业务不断调整无法靠硬编码塞进业务代码里—— 一旦写死每改一次就要发一次版成本巨大。二、为什么需要规则引擎没有规则引擎前改规则要发版改个阈值都要改代码、重新编译、重新部署无法热更新逻辑越搅越乱业务规则和设备接入、协议解析、数据存储纠缠在一起越来越难维护业务人员插不上手规则写在代码里业务方改一个告警阈值都要排队找开发无法统一治理规则散落各端看不到全局没法统一审计、测试、回溯换平台就报废规则跟着平台走换技术栈、换厂商全部重写。有了规则引擎把大大小小各种不同的场景联动从代码里解放出来变成一份规则资产后可编排 用可视化画布或声明式配置搭出规则链可热更新 改规则不碰代码加载即生效可读 业务人员也看得懂 “温度 30 就发短信”可复用 一条规则在云端、边缘、多语言实现间共享可测试、可审计 规则是数据可以校验、追踪、回归设备规模越大、联动越复杂“规则即资产” 的价值就越大三、Node-REDNode-RED 是 2013 年由 IBM Emerging Technology Services 团队开源的流式编程工具如今由 OpenJS 基金会维护。它用 “拖拽节点 连线” 的浏览器画布编排数据流社区贡献了数千个节点是物联网低代码领域绕不开的标杆。它验证了一件重要的事用 “节点 连线” 的流式模型表达场景联动但它的形态有两个 “绑定”绑定运行时独立运行在 Node.js 上绑定编辑器难以脱离编辑器独立流转、迁移Node-RED 是一个产品它证明了规则该长什么样但它没有回答另一个问题规则的 “语法” 能不能成为一份与实现无关的公共标准四、乐吾乐的选择先定义标准再写实现乐吾乐le5le.com的做法是倒过来做的第一步定义语法标准规则节点声明、连线路由数据、消息流转、节点分类、执行动作 —— 这些规则与任何语言、任何运行时、任何前端无关它只规定 “规则应该怎么写、应该怎么执行”。第二步给出参考实现官方标准语法用纯 Go 实现了一版可嵌入的规则引擎 ——github.com/le5le-com/rule-flow以 MIT 协议开源。注意定位它是标准的 “官方实现之一”不是唯一的实现和使用方式。语法是标准Go 版是参考实现 —— 这个是整个设计最核心的地方。五、为什么 “标准 参考实现” 更好1. 规则与运行时解耦一种标准语法多种实现、集成和使用方式标准描述的是 “规则语义”不规定用什么语言实现。因此Rust 写边缘网关可以基于标准实现一个高性能引擎Java 写平台服务端可以基于标准实现一个企业版引擎Node / C / Python 团队都可以各自实现同一份规则 JSON 原样迁移。规则文件从此是用户的资产不再是某个运行时的附属品。2. 规则与可视化解耦任意前端技术都能做编辑器标准定义的是语义不是画布。可视化编辑器只是规则的 “编辑入口”官方编辑器基于乐吾乐自研的Meta2d.js实现即将开源第三方完全可以基于 Vue、React、原生 Canvas 做自己的编辑器编辑器的产出是同一份标准 JSON谁画的规则换到别的编辑器都能打开。“编辑器换一家规则不报废”—— 这对平台选型是巨大的安全感。3. 多语言生态可互操作同一份规则 JSON 可以跨实现流转测试用例、语法校验器、规则模板库可以跨语言共享。Go 版自带的单元测试某种意义上就是标准的 “可执行规格”。4. 标准越清晰越容易做校验、测试与审计语法边界明确节点类型、参数槽、出口、作用域就很容易写出规则语法校验器加载前检查而不是运行时才发现规则执行追踪每条消息走了哪条路径规则回归测试同样的输入不同实现应有同样的输出。5. 平台中立规则可迁移用户在一家平台编排好的联动规则理论上可以带着走。规则不再被某个厂商的运行时或编辑器绑架 —— 这正是标准化带来的长期价值。六、这套标准到底规定了什么1. 节点模型每个规则节点由六部分组成id / type / config / inputs / inputMode / payload / outputs。type定义了六类节点各司其职类型职责trigger触发器cron 定时 /interval 周期 /countdown 倒计时 / 消息监听 / 第三方订阅http、mqtt、sse、websocket 脚本过滤condition条件 ! 、区间[)、集合[]、AND/OR、自定义脚本或子流switch多路分支first命中即停 /all全命中支持 default 兜底action动作设备指令、http、mqtt、db、email、sms、voice、alert、message、emit 等副作用由宿主回调执行function函数内置函数uuid7、avg、sum、merge、pick、debounce、throttle…、goja 脚本、子流block组合节点把一段子流封装成一个可复用节点2. 连线与数据路由规则链是一张有向图上游执行完按outputs.ids触发下游数据落到连线key指定的输入槽outputs: { ids: [{ id: a1, key: temp }], // 触发 a1数据落到 a1 的 temp 参数 elseIds: [], // 条件为假时的出口仅 condition errorIds: [] // 执行失败的异常出口 }关键设计inputs** 是形参声明路由信息集中在上游**。节点可任意复制、组合节点可多处复用参数签名不变、上游各指各的。3. 消息与作用域节点间流转统一用一条msg{ payload: {...}, value: any, error: string }payload流作用域贯穿整条链路分支扇出后写时拷贝COW隔离value传递作用域只往下走一跳落进下游输入槽error仅异常出口非空带errorId指明失败节点。4. 执行语义串行、并行、条件分支都支持触发层并发传播层深度优先展开按路径做环检测多输入扇入靠inputMode控制缺省pair到齐才执行一次、any任一到达即执行、continuous到齐后任一更新即重算条件为真走ids、为假走elseIds、执行异常走errorIds—— 三个出口语义互不混淆。七、官方参考实现Go 版 rule-flow标准可以有很多实现官方先出了 Go 版https://github.com/le5le-com/rule-flow使用// 1. 全局动作处理器所有动作副作用都回调到这里 ruleflow.ActionHandler func(msg string, params map\[string]any) (any, error) { return ok, nil // 非 nil 覆盖 msg.valuenil 则 msg 原样流向下游 } // 2. 全局错误上报可选 ruleflow.ErrorHandler func(nodeID string, err error) { /\* 记日志/告警 \*/ } // 3. 注册并启动场景触发器自动后台运行宿主随时可主动投递消息 _ ruleflow.Start(scene-1, nodesJSON) ruleflow.Emit(scene-1, device-report, 36.5)生命周期 Start / Restart / Stop / StopAll / Remove 齐全多节点集群里非 leader 节点设 SelfDriven false避免定时类触发器重复触发。一个 “温度超限 → 短信告警” 的规则就是一段纯声明 JSON[ {id: t1, type: trigger, config: { message: device-report, deviceId: dev-1},outputs: { ids: [{ id: c1, key: temp }] } }, { id: c1, type: condition, config: { relation: },inputs: [{ key: temp }, { key: limit, value: 30 }],outputs: { ids: [{ id: a1 }], elseIds: [{ id: a2 }] } }, { id: a1, type: action, config: { kind: sms, to: 13800000000, text: 温度超限 } }, { id: a2, type: action, config: { kind: http, http: http://le5le.com, method: POST } } ]八、生态与路线图多语言、多前端多语言实现Rust / C / Java / Node 等团队都可以基于这套语法实现自己的引擎规则 JSON 互通可视化开源官方编辑器基于乐吾乐自研的 Meta2d.js 实现即将开源第三方也可以基于任意前端技术做编辑器标准工具链语法校验器、规则模板库、跨实现回归测试都可以围绕标准长出来。维度Node-RED这套标准 Go 参考实现定位一个完整的可视化编程产品一份语法标准 官方参考实现运行时绑定 Node.js与语言无关官方先实现 Go 版规则形态画布 JSON含坐标等 UI 信息纯声明式标准 JSON引擎直接消费与编辑器关系编辑器即产品解耦任意前端可做编辑器官方基于 Meta2d.js多语言生态依赖 npm 社区节点各语言可基于标准各自实现规则互通许可Apache 2.0参考实现 MIT九、适合谁、怎么开始物联网平台 / 网关团队边缘计算团队想做规则编辑器的人规则引擎学习者仓库自带完整语法文档节点类型、config 字段速查、作用域与数据流、异常语义和覆盖全部节点类型的示例与单元测试上手成本极低。十、结语物联网规则引擎的真正价值不该是 “我们家的引擎多好用”而是 “规则本身能不能成为一份公共资产”。Node-RED 证明了流式规则模型的正确性乐吾乐往前走了一步 ——把规则提炼成与语言无关的语法标准并开源了官方 Go 参考实现。Rust、C、Java、Node 都可以基于同一份规范给出自己的答案可视化编辑器也可以基于任意前端技术实现。标准先行实现随行。这才是规则引擎领域值得期待的方向。链接引擎标准语法定义文档乐吾乐文档中心 - 引擎标准语法定义文档Github https://github.com/le5le-com/rule-flow其他乐吾乐可视化规则引擎编辑器前端即将开源敬请期待参考乐吾乐官方文档doc.le5le.comNode-RED 官方文档nodered.org
返回列表