n8n 凭借「可视化 + 代码片段」混合范式成为自动化领域现象级项目,但 2024 年起其 fair-code 许可证收紧:云端高级功能闭源、SSO / 审计等企业特性不再随仓库开放。对于需要 100% 源码可控、二次商业发布的团队, Apache-2.0 的替代方案成了刚需。2025 年 1 月上线的 SimStudioAI(简称 Sim)正是瞄准这一缺口:GitHub 7.5k star、单仓库即可编译,宣称「n8n 用户零学习成本迁移」。本文从架构视角拆解 Sim 如何构建可扩展的 workflow 引擎,并给出可直接落地的部署参数与监控要点。
一、许可证先行:fair-code 与 Apache-2.0 的工程差异
n8n 的 fair-code 允许「源码可见、自用免费」,但附加 Commons Clause—— 销售托管服务即触发限制;而 Sim 采用标准 Apache-2.0,无附加条款,意味着:
- 可闭源修改后商业分发
- 可嵌入 OEM 设备或 SaaS 再销售
- 无需向原作者开放衍生代码
对于 ISV、私有化集成商而言,Apache-2.0 直接消除合规焦虑,也便于申请等保、信创认证。
二、事件驱动执行引擎:从 DAG 到可抢占拓扑
Sim 的核心执行层用 TypeScript 实现,依赖图(DAG)在运行时展开为「事件 - 槽位」模型:
- 画布节点(Block)被编译为统一接口
IBlock.run(ctx): Promise<BlockOutput>; - 引擎维护一个优先队列,按依赖就绪度调度;
- 每个 Block 完成时触发
block:end事件,下游节点若入度归零则被推入队列; - 支持「抢占」:高优节点(如实时 Webhook)可中断低优批处理,通过
AbortController取消正在运行的容器脚本。
该设计带来三点扩展性收益:
- 水平扩容无状态:队列可外迁到 Redis Streams,执行器 Pod 数随 CPU 线性扩展;
- 细粒度重试:失败节点仅局部回溯,无需重放整个 workflow;
- 实时状态同步:WebSocket 通过
socket.io-adapter把事件广播到所有客户端,调试体验与 n8n 一致。
三、节点热插拔:平均 200 行代码自定义 Block
Sim 把「节点」抽象为 NPM 包规范:
my-block/
├─ package.json (name=sim-block-xxx)
├─ src/index.ts 导出 Block 类
└─ src/icon.svg 48x48 单色图标
引擎运行时调用 npx sim-block-xxx@latest,通过 dynamic import 把类注册到画布。官方提供模板仓库,开发者只需:
- 继承
Block基类,实现async run(); - 用
zod声明入参 JSON Schema; npm publish即可在 30 s 内出现在所有 Sim 实例的节点面板。
由于 Block 进程与主引擎解耦,即使脚本死循环或 OOM,也只影响当前 workflow,不会拖垮整个实例。Sim 还内置 @block/validator 做静态扫描,禁止 eval、require('fs') 等危险 API,降低供应链投毒风险。
四、多模型热切换:统一 LLM Provider 抽象
AI 场景下,模型升级节奏远高于传统 connector。Sim 在数据层引入 provider_version 表:
| provider_id | model_name | version | endpoint_url | creds_key |
|---|---|---|---|---|
| openai | gpt-4o | 2025-11 | https://api.openai.com | sk-*** |
| anthropic | claude-3-5 | 2025-10 | https://api.anthropic.com | sk-ant-*** |
| ollama | llama3.2 | 3.2-3b | http://ollama:11434 | — |
workflow 运行前解析 ${{ llm.provider() }} 变量,自动注入最新版本与密钥;当需要回滚时,只需把 is_active 切回旧记录,无需修改 JSON 画布。该机制同样适用于 Embedding、TTS、STT 等模型,保证「向上兼容、向下可回滚」。
五、落地参数与生产清单
以下配置在 4 vCPU / 8 GiB 节点、单实例 200 concurrent workflow 压测验证通过,可直接写入 docker-compose.prod.yml:
services:
simstudio:
image: ghcr.io/simstudioai/sim:1.4.0
environment:
# 执行引擎
SIM_EXEC_MAX_CONCURRENT: