Hotdry.

Article

Sim Studio 节点热插拔与本地沙箱隔离方案

基于 Apache-2.0 的 AI 工作流引擎 Sim Studio 如何通过动态加载与 E2B firecracker microVM 实现节点级热插拔与秒级沙箱隔离,并给出可直接套用的安全参数清单。

2025-12-11systems-engineering

节点即独立包:manifest + 动态 import

Sim Studio 把「节点」视为最小可交付单元,源码位于 packages/blocks/src/{category}/{name}/,每个节点必须提供 manifest.json

{
  "id": "llm-openai",
  "version": "1.0.0",
  "runtime": "nodejs",
  "entry": "index.ts",
  "permissions": ["network", "filesystem:ro"],
  "env": { "OPENAI_BASE_URL": "https://api.openai.com" }
}

主进程启动时会扫描 plugins/ 目录,利用 Bun 的 import.meta.resolve 做动态导入,节点注册表仅在内存维护一张 Map<id, BlockModule>。因此新增节点无需重启整个应用,满足热插拔的前置条件。

热插拔四步:上传 → 校验 → 写入 → 挂载

  1. 上传:前端 tgz 包通过 /api/blocks/upload 提交,文件名规则 {id}@{version}.tgz
  2. 校验:服务端先用 tar -tzf 解压列表,再用 zod 校验 manifest 字段;若声明 runtime: python,则额外检查 requirements.txt 是否存在。
  3. 写入:校验通过后包体写入 plugins/{id}/{version}/,并在 block_versions 表插入一行,标记 enabled=false
  4. 挂载:管理员在 UI 点「启用」后,后端通过 EventEmitter 通知所有运行中的 WorkflowRunner;runner 收到 block:reload 事件,把旧模块从 require.cache(或 import.meta.cache)删除,再重新 import(),完成零停机切换。

整个流程平均耗时 <800 ms,其中挂载步骤占 50 ms,对正在执行的流程无影响 —— 正在跑的节点继续用旧代码,新启动的节点用新版本,实现「蓝绿」效果。

沙箱隔离:E2B firecracker microVM

Sim Studio 把「任意代码执行」外包给 E2B,每次运行节点时动态起一台 firecracker microVM:

  • 冷启动 ≤400 ms(实测 2025-12 M 系列 Mac + Docker Desktop)。
  • 内存限额 512 MB(可配),CPU 1 vCore;超出即 OOMKill,runner 捕获后把任务标记为 FAILED 并回滚上游事务。
  • 根文件系统只读,仅 /tmp 可写,且 size=10 MB,防止日志打爆磁盘。
  • 网络默认全关,manifest 里声明 `permissions: [

systems-engineering