iii
用 Rust 编写的后端运行时引擎,通过 Worker/Function/Trigger 三元组实现
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 Rust 编写的后端运行时引擎,通过 Worker/Function/Trigger 三元组实现
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你的团队刚刚完成了一个推荐算法服务,需要快速接入消息队列、定时任务、可观测性监控和 API 网关。按照传统做法,每个环节都需要单独集成——评估供应商、配置连接参数、处理序列化格式、商讨超时策略。一个"看似简单"的功能,可能涉及十几个配置文件和数天的联调时间。
这就是 iii(Interoperable Invocation Interface)试图解决的问题。iii 是一个用 Rust 编写的新型后端运行时引擎,它用三个极简概念(Worker、Function、Trigger)替代了传统架构中的碎片化集成方案,让"添加一个服务能力"变成一条命令。
后端系统的集成复杂度并非新问题。从 ESB(企业服务总线)到微服务架构,从 RPC 框架到事件驱动系统,四十年来工程师们不断在"解耦"与"协作"之间寻找平衡。但每引入一个新组件(队列、缓存、监控、Cron),系统就多一层耦合。这种耦合不仅是代码层面的,更体现在团队沟通、文档维护和故障排查上。
iii 的前身是 Motia——同样由 Motia LLC 团队开发的后端框架。在 2025 年的技术博客中,团队公开宣布 Motia 将逐步迁移至 iii,并将 iii 定位为一次真正的范式转移(paradigm shift)。这不是简单的版本迭代,而是一次对"后端系统应该如何组合"的核心重新思考。
该团队的核心论点是:Unix 通过"一切皆文件"统一了 I/O 抽象;React 通过"一切皆组件"统一了 UI 构造;iii 试图用"Worker + Function + Trigger"统一后端服务的发现、调用和观测。这种类比虽然大胆,但它揭示了一个真实的痛点——后端领域至今缺少一个足够简单、又足够强大的抽象层。
iii 的整个设计哲学浓缩为三个原始概念,理解它们只需要几分钟,但由此构建的能力却异常丰富。
Worker(工作者) 是 iii 世界中的主角。任何一个进程——无论是 TypeScript 的 API 服务、Python 的数据处理管道,还是 Rust 的微服务——只要连接到 iii 引擎并注册自身,就可以成为 Worker。Worker 是自描述的,它会告诉引擎"我能做什么"(Functions)和"什么情况下我应该行动"(Triggers)。关键在于:Worker 的身份与运行位置无关——运行在 Docker 容器、Kubernetes Pod、边缘节点、浏览器 Tab,甚至是树莓派上,它们在 iii 眼中是同质的。这种位置无关性为动态扩缩容和故障恢复提供了极大的灵活性。
Function(函数) 是 Worker's API 接口。每个 Function 拥有稳定的命名空间(如 content::classify、orders::validate),引擎通过这个命名空间在全系统范围内路由调用。这意味着一个 Worker 定义的函数可以被网络中任意其他 Worker 直接调用,无需知道对方运行在哪里、用什么语言编写。这消除了服务发现(service discovery)的传统复杂性——因为"服务发现"在 iii 中变成了"浏览 Worker 目录"。
Trigger(触发器) 定义了 Function 何时被调用。iii 支持多种 Trigger 类型:直接函数调用、HTTP 端点、Cron 定时、队列订阅、状态变更、事件流等。Trigger 是声明式的,Worker 只需声明"当 X 发生时调用 Y",iii 引擎自动处理路由、序列化和交付。这与传统的轮询模式或硬编码回调形成鲜明对比。
三个概念的组合逻辑异常简洁:如果一个系统所有参与者都通过 Worker 注册进来,所有能力都通过 Function 暴露,所有行为都通过 Trigger 驱动——那么这个系统天然就是可观测的(因为所有调用都经过引擎),天然就是可组合的(因为所有 Worker 互相可见),天然就是可扩展的(因为新 Worker 只需注册即可加入)。

图1:传统点对点集成 vs iii 零集成架构对比
上图直观展示了 iii 的核心价值:传统架构中每新增一个服务能力都需要与现有所有服务建立连接(O(n²) 复杂度),而在 iii 架构下,所有服务只需连接到共享引擎,所有交互通过引擎路由(O(n) 复杂度)。
iii 采用 Rust 作为引擎核心语言,这一选择并非偶然。Rust 以其内存安全保证和高性能著称,这对于一个需要承载所有服务间通信的运行时引擎至关重要——任何在通信层的性能损耗或内存问题都会放大至整个系统。
engine/ 目录是 iii 的核心,包含运行时(runtime)、模块系统和通信协议。引擎通过 WebSocket 与各语言 SDK 通信,这意味着连接是双向的、长连接的,与传统的 HTTP REST 调用有本质区别。长连接允许引擎实时推送 Worker 注册/注销事件、函数调用结果和链路追踪数据,这是实现"实时观测"的技术基础。
iii 同时维护 TypeScript/Node.js、Python 和 Rust 三套 SDK,所有 SDK 遵循统一的 API 设计原则。以 Rust SDK 为例,注册一个函数仅需以下代码:
use iii_sdk::{register_worker, IIIError, Value, InitOptions};
async fn transform(input: Value) -> Result<Value, IIIError> {
let nums: Vec<f64> = serde_json::from_value(input)?;
let result: vec![`nums.iter().map(|x| x * 2.0).collect()];
Ok(json!(result))
}
let iii = register_worker("ws://localhost:49134", InitOptions::default())?;
iii.register_function("data::transform", transform);
对比 Python SDK 和 TypeScript SDK,同样的业务逻辑在外观上几乎一致,真正实现了"一次学习、多处复用"的多语言开发体验。
iii-console 是专为 iii 运行时设计的开发运维控制台,采用 React 前端 + Rust 后端的架构。它提供 Worker 状态监控、函数调用追踪、队列管理、日志查看和实时状态仪表盘。安装通过一条命令即可完成:
curl -fsSL https://raw.githubusercontent.com/iii-hq/iii/main/console/install.sh | bash
安装脚本本身质量较高,包含版本指定、多平台目标支持、环境变量配置和 PATH 修改选项。这表明项目在工程实践上有较高的成熟度。
iii 采用 Turborepo + pnpm workspace 管理 monorepo,这是一个 JavaScript 生态中成熟的方案。核心模块包括:
| 模块 | 技术栈 | 说明 |
|---|---|---|
engine/ | Rust | 核心运行时、协议、CLI |
sdk/packages/node/ | TypeScript | Node.js SDK (npm: iii-sdk) |
sdk/packages/python/ | Python | Python SDK (PyPI: iii-sdk) |
sdk/packages/rust/ | Rust | Rust SDK (crates.io: iii-sdk) |
console/ | React + Rust | 开发者控制台 |
docs/ | Mintlify/MDX | 文档网站 |
crates/ | Rust | 独立工具箱 crate |
值得注意的是,项目使用 Biome 作为 JS/TS 的 linting 和 formatting 工具,这是一个新兴的、Go 编写的极速工具链,展示了团队对新工具的开放态度。
iii 的设计中蕴含着深刻的 AI 时代考量。虽然 iii 本身不包含训练代码或模型权重,但它被设计为 AI Agent 的"操作系统"——这一点从项目的核心定位和 Worker 概念中清晰可见。
iii 团队明确指出:iii 的架构与 AI Agent 的需求高度契合。当一个 Agent 需要执行任务时,它可能需要搜索工具、代码执行工具、API 调用工具和文件操作工具。在传统架构中,这些工具来自不同服务,需要分别对接。而在 iii 中,每个工具都是一个 Worker——Agent 可以动态注册新工具、发现已有工具、调用它们并获得统一格式的追踪结果。
iii 的 worker registry(workers.iii.dev)已经收录了多种预构建 Worker,包括队列、可观测性、Sandbox 等。这意味着开发者或 Agent 可以用 iii worker add <name> 命令将新能力注入系统,无需了解其内部实现。
从项目结构看,iii 的代码质量处于较高水平:Rust 代码使用 Clippy 进行严格 linting(-D warnings 级别),JS/TS 代码使用 Biome 格式化,Python SDK 使用 uv 管理环境并配备完整测试套件。版本管理使用语义化版本(semver),Workspace 统一管理依赖。Rust 生态中的测试覆盖率也相当完整(cargo test --workspace --all-features)。
iii 项目于 2025 年 1 月创建,仅用不到两年时间就积累了超过 16,000 颗 GitHub Stars(当前实时数据 16,408 颗),1,089 个 Fork,39 个 Open Issues。仓库保持高频更新(最新推送在 2026-05-27),这表明项目仍处于活跃开发状态。从话题标签(topics)来看,项目覆盖了 agents、ai、genai、developer-tools、framework 等多个热门领域,展现了广阔的受众定位。
iii 的安装极为简单,一条命令即可:
curl -fsSL https://install.iii.dev/iii/main/install.sh | sh
安装完成后,验证版本并初始化项目:
iii --version
iii project init myapp
cd myapp
iii # 启动引擎
添加新能力同样简单:
iii worker add queue
iii worker add agent
iii worker add sandbox
每个 Worker 添加后会立即出现在 iii 的实时目录中,其他所有 Worker 可以立即发现和调用它。这种"即插即用"的设计哲学贯穿整个项目。
不过值得注意的是,iii 尚未提供 Docker 或 Kubernetes 原生支持。安装脚本虽然质量高,但它只提供 Linux/macOS 的 shell 安装方式。对于习惯容器化部署的团队(如希望将 iii 引擎打包进 Docker Compose 的团队),当前的部署方式存在一定门槛。这是 iii 当前最明显的局限。
任何试图"统一一切"的项目都必须面对一个根本性挑战:抽象泄漏(abstraction leak)。当系统足够复杂时,原本被抽象掉的细节会以边界情况的形式重新出现。
iii 的三元组抽象在大多数场景下足够优雅,但在以下场景中可能面临压力:
此外,iii 目前仍处于快速发展阶段(版本 0.16.0-next.2),API 稳定性尚未得到充分验证。团队尚未采用正式的企业支持模式,对于有 SLA 要求的商业项目可能存在风险。
iii 的出现并非孤例。它代表了近年来后端领域的一个明确趋势:用统一抽象层替代碎片化集成。类似的思路可以在 Temporal(工作流编排)、Supabase(数据库即服务统一层)、Conduit(服务网格数据平面)等项目中看到。但 iii 的独特之处在于它的抽象足够底层(接近通信协议层),同时又足够上层(开发者直接接触),这使得它既有技术深度,又有产品广度。
从增长数据看(16K+ Stars, 1K+ Forks),市场对这类"后端统一层"的需求是真实的。随着 AI Agent 逐渐成为主流应用形态,对"让 Agent 动态发现和使用工具"的基础设施需求只会增加。iii 在这个时间点的活跃发展,恰好踩在了技术周期的关键节点上。
iii 是一个雄心勃勃的项目:试图用 Rust 编写的核心引擎 + 三语言 SDK + 实时注册协议,构建一个"无摩擦集成"的后端运行时。它的核心价值主张——Worker/Function/Trigger 三元组——足够简单,简单到可以装进脑子里,同时又足够强大,能够支撑队列、Cron、AI Agent、Sandbox 等复杂场景。
当前版本(0.16.0-next.2)展现了良好的工程成熟度(完整的测试套件、多语言 SDK、精心编写的文档和安装脚本),但容器化支持缺失和高频迭代状态是需要关注的现实约束。对于愿意参与前沿实验的 AI 开发者和平台工程师,iii 是一个值得投入时间的项目;对于需要稳定生产级保障的团队,建议保持关注并等待 1.0 版本的发布。

图2:使用 iii worker add 命令动态添加新能力