Beta GitHub Releases 提供最新 Beta 版本下载 · 4.1.15-beta

Rust 重铸的 Node-RED 运行时

EdgeLinkd 以单个原生二进制文件运行你现有的 flows.json:内置完整的 Node-RED 编辑器,运行时节点由 Rust 实现,内存占用约为 Node-RED 的十分之一。

  • Apache-2.0
  • Rust 1.88+
  • Linux · Windows
  • x86_64 · AArch64 · ARMv7
EdgeLinkd 网页编辑器中的 Node-RED 流程:inject 节点进入 switch,并分发到三个 debug 输出。
≈10%
Node-RED 的内存占用
1
个自包含二进制,内置编辑器
6
个官方支持的目标平台
v4.1.15
作为行为基准的 Node-RED 版本
01为什么选择 EdgeLinkd

保留流程,卸下重量。

Node-RED 让基于流程的编程走向主流。EdgeLinkd 保留它的编辑器、流程格式与消息语义,只把底层的 Node.js 运行时换成原生 Rust。

Node-REDEdgeLinkd
执行方式Node.js 与 V8:JIT 编译、垃圾回收基于 Tokio 的原生 Rust:无 JIT、无垃圾回收
调度模型标准运行时受限于单个 JavaScript 事件循环Tokio 多线程调度器让独立节点任务跨多个 CPU 核心运行
内存基准约为 Node-RED 的 1/10
JavaScript每个节点都是 JavaScript仅在 function 节点中运行,使用内嵌的 QuickJS 沙箱
流程格式flows.json同一份 flows.json,无需任何转换
编辑器Node-RED 编辑器同一个编辑器,由二进制自身提供
部署先安装 Node.js,再安装 npm 包复制一个二进制;生产环境加上 --headless
扩展方式npm 包Rust crate,通过 #[flow_node] 静态链接

坦诚的取舍: 第三方 npm 节点无法在 EdgeLinkd 上运行;超出嵌入式资源预算的功能会在部署时明确报错,而不是被悄悄忽略。

02核心能力

一个原生进程,一套完整的流程运行时。

设计、部署、运行都在同一个二进制里完成。除了你在 function 节点里写的代码,其余一切都是编译后的 Rust。

直接使用 flows.json

在 Node-RED 编辑器中编排,部署同一份 JSON。流程、子流程、Link 节点、环境变量与 JSONata 表达式均遵循 Node-RED 语义。

流程子流程环境变量JSONata
[
  { "id": "f1", "type": "tab", "label": "Sensors" },
  { "id": "n1", "type": "mqtt in", "z": "f1",
    "topic": "sensors/+", "wires": [["n2"]] },
  { "id": "n2", "type": "json", "z": "f1",
    "wires": [["n3"]] }
]

内置编辑器

完整的 Node-RED 编辑器随二进制一同发布:节点面板、部署、调试侧栏、导入导出一应俱全。使用 --headless 即可关闭。

JavaScript 只出现在你写的地方

所有节点均为原生 Rust。function 节点运行在内嵌的 QuickJS 沙箱中,提供 node、context、flow、global、env 与 RED.util。

多线程异步调度

标准 Node-RED 运行时受单个 JavaScript 事件循环限制。EdgeLinkd 为每个节点创建独立任务,由 Tokio worker 线程跨多个 CPU 核心调度;同时保持单个节点内部按序处理,并在每条连线上形成背压。

用 Node-RED 自己的规范来验证

上游 mocha 测试被移植为 pytest,通过 PyO3 模块直接驱动 Rust 引擎运行,测试标题与上游逐字一致。

为嵌入式目标而裁剪

发布构建以体积为优化目标,启用 LTO 并剥离符号;各类节点由 Cargo feature 控制,最小镜像只编译用得到的部分。

x86_64aarch64armv7
[profile.release]
opt-level = "z"     # 以体积为优化目标
lto = true
codegen-units = 1
strip = true

[features]
default = ["core", "js", "jsonata", "nodes_network",
           "nodes_storage", "nodes_parser"]
03架构

一个进程,三个 crate,每个节点一个任务。

edgelinkd 二进制同时承载运行时与编辑器。部署时,流程被构建为由有界通道连接的 Tokio 任务图;所有 I/O 都发生在这张图的边缘。

设计期
Node-RED 编辑器浏览器

由 edgelinkd 提供,直接部署到引擎

flows.json文件

原样使用 Node-RED 流程格式

edgelinkd.toml配置

启动时与命令行参数合并

Admin API · WebSocket
edgelinkd单个原生进程
应用宿主src/
runlist--headless配置log4rs
edgelink-webcrates/web
Admin HTTP API编辑器资源调试通道axum
edgelink-corecrates/core
引擎
加载 · 部署 · 重新部署 · 停止
流程
流程 · 子流程 · 分组 · Link
消息模型
Msg · Variant · MsgHandle
上下文
内存与本地文件存储
JSONata
纯 Rust 的 jsonata-core
JS 桥接
QuickJS · 仅用于 function
inject function switch mqtt out
1 个节点 = 1 个 Tokio 任务 · 有界 mpsc 收件箱 · 按序投递
节点库runtime/nodes · node-plugins/
commonfunctionnetworksequenceparserstorage

通过 #[flow_node] 与 inventory 自注册——不存在中心化的节点清单。

TokioLinuxWindowsx86_64AArch64ARMv7
边缘 I/O
MQTTrumqttc

订阅与发布到消息代理

HTTPaxum · reqwest

入站端点,出站请求

WebSockettungstenite

监听端与客户端

TCP / UDPtokio

原始套接字,单播与组播

文件fs

file · file in · watch

进程exec

执行命令并发送信号

网络 · 文件 · 进程
规范测试工具链tests/ · crates/pymod

移植为 pytest 的 Node-RED mocha 规范,在每次 CI 中通过 PyO3 扩展 edgelink_pymod 驱动真实引擎。

pytestPyO3以 Node-RED v4.0.9 为基准
edgelinkd 进程视图。实线箭头表示运行期的流程与消息;虚线框中的测试工具链在 CI 中驱动同一个引擎。
01

部署即构建任务图

引擎解析 flows.json,在注册表中解析每个节点类型,为每个节点创建一个 Tokio 任务,并按输出端口连线。

02

有界连线,真正的背压

每个收件箱都是有界通道。慢消费者会拖慢上游生产者,而不是让队列无限增长——小设备上的内存占用始终可预期。

03

有序、共享的消息

消息以共享的 Arc<RwLock<Msg>> 句柄传递,每个节点逐条处理,保持 Node-RED 的顺序保证。

04

原生优先,脚本兜底

JSONata 由纯 Rust 求值;只有 function 节点会进入 QuickJS,热路径上的其余部分全是编译后的代码。

04兼容性

支持的,就严格兼容;不支持的,就明确拒绝。

EdgeLinkd 是兼容 Node-RED 的运行时,而不是它的克隆。凡是提供的功能,行为必须与 Node-RED v4.0.9 一致;凡是超出嵌入式预算的功能,都会被明确拒绝。

  • 要么一致,要么不提供

    对每个已支持的节点与选项,消息语义、错误与状态行为、编辑器契约都与上游保持一致。

  • 绝不假装支持

    没有静默的空操作,也没有看似合理的桩实现。不支持的配置会在部署时失败,或返回 NotSupported。

  • 靠审计,而非假设

    自动生成的报告逐个节点比对移植测试与上游 describe()、it() 标题。

运行时特性

  • 流程已通过规范测试
  • 子流程已通过规范测试
  • 环境变量已通过规范测试
  • function 沙箱中的 RED.util已通过规范测试
  • JSONata(jsonata-core)进行中
  • 上下文:内存与本地文件系统进行中
  • 分组进行中
  • 插件子系统(静态链接)进行中

核心节点状态

已通过规范测试可用(部分差异)进行中
通用12/12
  • inject
  • debug
  • complete
  • catch
  • status
  • link in
  • link call
  • link out
  • comment
  • junction
  • unknown
  • global-config
函数9/9
  • function
  • switch
  • change
  • range
  • template
  • filter (rbe)
  • delay
  • trigger
  • exec
网络17/17
  • mqtt in
  • mqtt out
  • mqtt broker
  • http in
  • http out
  • http request
  • websocket listener
  • websocket client
  • websocket in
  • websocket out
  • tcp in
  • tcp out
  • tcp get
  • udp in
  • udp out
  • tls
  • http proxy
序列4/4
  • split
  • join
  • sort
  • batch
解析5/5
  • json
  • xml
  • csv
  • html
  • yaml
存储3/3
  • file
  • file in
  • watch
“可用”表示节点已实现并可使用;“已通过规范测试”表示同时对齐了已覆盖的 Node-RED 测试。 完整规范覆盖报告
05快速开始

从克隆到运行流程,只需三条命令。

EdgeLinkd 使用稳定版 Rust 构建,GitHub Releases 上也提供 Beta 版本的预编译包。

  1. 01

    带子模块克隆

    固定版本的 Node-RED 子模块提供编辑器资源,同时也是行为对照基准。

    git clone --recursive https://github.com/oldrev/edgelinkd.gitcd edgelinkd
  2. 02

    构建发布版二进制

    需要 Rust 1.88 或更高版本。Windows 上请确保 Git 自带的 patch.exe 位于 PATH 中,并安装 MSVC 工具链。

    cargo build --release
  3. 03

    带编辑器运行

    启动引擎,并在 http://127.0.0.1:1888 提供 Node-RED 编辑器。

    ./target/release/edgelinkd run
  4. 04

    生产环境无界面运行

    同样的流程,不启动 Web 服务。若需要从其他机器访问编辑器,可改用 --bind 0.0.0.0:1888。

    ./target/release/edgelinkd run ./flows.json --headless
06应用场景

EdgeLinkd 适合在哪里运行。

凡是适合用 Node-RED 流程、却不适合跑 Node.js 运行时的地方。

物联网边缘网关

在设备旁就地聚合、过滤传感器数据——MQTT、HTTP、TCP 与 UDP——只占用极少内存。

工业自动化

在嵌入式控制器上运行控制与数据采集流程,维护时随时打开 Web 编辑器。

家庭自动化

把智能家居逻辑放在树莓派级别的开发板上,而不必背负完整的 Node.js 栈。

从云端迁移到边缘

把现有的 Node-RED 流程从服务器搬到设备上,无需重写。

精简容器

小巧的镜像里只放一个二进制,Web 界面可有可无。

从原型到生产

开发时在内置编辑器中快速迭代,现场以 headless 模式部署同一份流程。

把你的流程,带到边缘。

EdgeLinkd 以 Apache-2.0 协议开源,并以公开方式开发。欢迎试用、反馈问题,或者移植下一个节点。