iii 架构入口精读:用 Worker、Trigger、Function 三原语把系统集成成本从平方级降到零
2026/9/13 7:18:43 网站建设 项目流程

iii 架构入口精读:用 Worker、Trigger、Function 三原语把系统集成成本从平方级降到零

【免费下载链接】iiiEffortlessly compose, extend, and observe every service in real-time for the first time ever.项目地址: https://gitcode.com/GitHub_Trending/mo/iii

本文基于 iii 仓库docs/0-12-0/index.mdx这一版本文档站首页展开,系统梳理 iii 的核心理念:为什么现代系统集成成本随服务数量平方级增长、iii 如何用 Worker / Trigger / Function 三个原语统一所有能力,以及"加一个新 worker"在协议层和工程实践上如何落地。读完本文,你将掌握 iii 的心智模型、iii worker add的增量扩展方式,并能沿文中路径深入 Quickstart 实战教程 和 Engine 源码。

问题:集成边数随服务数量平方级增长

原文档开篇直接点出痛点:现代系统中的每个服务都自带独立的内核、生命周期、集成方式与故障模式。服务之间每多一对,就多出若干跨系统交互边:4 个服务意味着 6 条可能的集成边($n(n-1)/2$),20 个服务则意味着 190 条。

这里的"边"不只是两个系统间的调用点。原文档特意举例:引入一个 agentic harness(智能体运行壳)时,带来的不只是它与现有系统之间的一个集成点,还有它下游的众多消费者。也就是说,每新增一项能力,都会让你栈里已有的一切的协调成本二次方复利——这包括日志、调试、升级等下游摩擦,也包括阻塞新业务线、新合作方的上游摩擦。

解决方案:一切能力都由三个原语构建

iii 的回答是把软件组织成三个原语:

  • Worker(宿主):承载工作的进程,"something hosts work";
  • Trigger(原因):触发工作运行的事件,"something causes it";
  • Function(执行):真正被执行的命名处理器,"something does it"。

原文档给出的关键论断是:系统中的一切能力都可以由这三样东西构建——队列、cron、流式传输、沙箱、可观测性、智能体、业务逻辑、设备,甚至前端浏览器 UI。

原语在仓库文档中的精确定义

docs/0-12-0/index.mdx是理念层入口,understanding-iii 总览 则给出了工程化定义,并补充了第四个角色Engine(路由中枢)。两者合起来才是完整心智模型:

  • Worker:任何连上 Engine 并向其注册 Trigger 和 Function 的东西。Worker 可以运行在任何地方——笔记本、容器、浏览器标签页、microVM——只要它能向 Engine 打开一条 WebSocket 连接即可。
  • Trigger:由三部分组成:类型(HTTP、cron、队列消息、状态变更、另一个 Function 调用trigger)、配置(路径、调度计划、哪个队列)、以及它所调用的 function ID。
  • Function:Worker 内的命名处理器,接收 payload、返回结果。Function 标识符遵循service::name约定,例如math::add——math是命名空间,add是具体处理器。该约定保证 Function ID 跨 worker 重启和语言边界保持稳定。
  • Engine:协调者。接受 worker 连接、维护可用 Function 与 Trigger 的实时注册表(live registry)、把调用路由到当前提供目标 Function 的那个 Worker。

注册流程在协议层的印证

"worker 通过一条 WebSocket 连入系统"不只是文档表述,协议消息中可以直接看到对应实现。在 engine/src/protocol.rs 中,定义了RegisterFunction(worker 向 engine 注册一个 Function)与WorkerRegistered(engine 回执确认,并把分配给该 worker 的值回传)等消息类型——worker 加入系统、Function 进入注册表,走的正是这条协议链路。Engine 概念文档 进一步说明:worker 断开时,Engine 会移除其 Function 与 Trigger、取消在途调用,并通知系统其余部分拓扑已变更。

从平方级到零:加入系统是一条 WebSocket

原文档的 "Quadratic to Zero" 一节的核心主张:集成问题的摩擦不止发生在两个系统连接处,它还会制造日志、调试、升级等下游摩擦。而 iii 把这些努力降为零——加 2 个 worker 和加 200 个 worker 是同一个操作;一个新 worker 只需打开一条 WebSocket 连接加入系统,即刻对所有其他 worker 可见。

这个"零边际成本"在 understanding-iii/workers 中体现为一条设计原则:Worker 是有意设计为相互独立的进程,一个 worker 崩溃不影响其他 worker,Engine 只向当前连接的 worker 路由调用。"Any language, any runtime" 之所以是 iii 的具体属性而非愿景,正因为 worker 契约小到任何能用 WebSocket + JSON 的语言都能实现,且 Engine 对每个 worker 一视同仁。

iii worker add:系统的 npm 时刻

原文档提出一个很有辨识度的类比:iii worker add是"系统的 npm 时刻"。安装进来的不是一个库,而是一个完整的运行服务——一个队列 worker、一个沙箱 worker、一个分类器。一条命令,一个完整能力,立即可被系统中所有其他 worker 使用。

Quickstart 完整演示了这条命令的行为:

# 从包含 config.yaml 的目录运行,从注册表增量添加 state worker iii worker add iii-state # 添加本地 worker(自动安装依赖并启动) iii worker add ./workers/math-worker

典型输出为:

✓ Worker math-worker added to config.yaml Path /path/to/project/workers/math-worker ✓ Using cached deps (use --force to reinstall) ✓ math-worker started (pid: 12345) ✓ Worker auto-started

Quickstart 中的完整链路是:iii project init quickstart --template quickstart生成 Python + TypeScript 两个 worker →iii --config config.yaml启动 engine(监听ws://localhost:49134)→ 两次iii worker addiii trigger math::add_two_numbers a=10 b=20跨语言调用返回{ "c": 30 }→ 再iii worker add iii-http后,同一批 Function 无需改动 handler 即可通过curl -X POST http://localhost:3111/math/add-two-numbers访问。增量加 worker、零停机正是原文档"加 2 个和加 200 个是同一操作"的实证。

同一份契约,两个团队各就各位

原文档 "Same Contract, Both Sides" 一节描述的是组织层面的收益:应用团队注册 Function、声明 Trigger,只关心业务逻辑;平台团队发布 worker,只关心提供的能力;两边履行的是同一份契约。没有定制 SDK、没有内部客户端库、没有逐服务 API 契约——过去夹在两个团队之间的那层工作直接消失了。

从源码结构看,这份契约的"最小公共面"就是前文提到的 WebSocket + 协议消息:Function 的注册(RegisterFunction)、调用(Trigger 触发)、发现(实时注册表查询与订阅,见 engine.mdx 中提到的engine::workers-available/engine::functions-available订阅事件)。这也是后文"AI agent 能在单个上下文窗口内推理整个系统"的底层原因。

Any Language, Any Runtime:移动负载是重新部署,不是重写

原文档明确:运行在 Docker 里、Kubernetes 上、边缘、浏览器标签页、树莓派、硬件隔离 microVM 里的 worker 是同一种worker。移动一个负载是重新部署(redeploy),不是重写(rewrite)——序列化与路由由 Engine 处理。

Engine 文档 把这称为"架构无关路由"(architecture-agnostic routing):无论 Function 由笔记本上的 Python Agent、浏览器标签页里的 TypeScript Worker、microVM 里的 Rust 二进制,还是 Kubernetes 上的 OCI 镜像承载,Engine 走同一条路由路径。Quickstart 的拓扑图也印证了这一点:所有箭头都是 Worker 与 Engine 之间的 WebSocket,不存在 worker 到 worker 的直接通信——caller-worker调用math::add时,请求经 Engine 查注册表后路由到math-worker,响应原路返回,被调方看到的永远是 payload 而非 HTTP 请求。

为 Agent 而生的运行时:agent 即 worker

原文档 "Built for Agents" 一节的论证值得完整继承:

  1. iii 不是 agent 的 harness。大多数 agent harness 只解决问题的一个切片:聊天循环、工具调用沙箱、链式工作流。iii 的作用方式优于 harness,因为它本身就是整个系统已经在运行的那个运行时。
  2. 映射关系是精确的:agent 是 worker;agent 的工具是 Function;它的记忆是 state;它的编排是 Trigger。agent 不需要调用一个独立的"agent 运行时"来干活——运行时就是系统其余部分。
  3. 自扩展是关键差异点:一个遇到超出当前能力任务的 agent,可以在运行时注册新 worker、暴露新 Function、扩展它自身所在的系统。
  4. 人与 agent 共享同一心智模型:新工程师第一天就能 productive,因为心智模型在不同能力之间从不切换;AI agent 之所以能在单个上下文窗口内可靠地推理整个系统,是因为只有一套原语要学、只有一个永远准确的"系统中存在什么"的事实来源。
  5. 原文档的收束判断:随着 agent 承担越来越多构建与运维软件的工作,原语集合的大小本身会成为复利因素——更低的上手成本、更便宜的提示词开销、更快的扩展、更简单的维护。

上手路径:安装 + Quickstart

原文档 "Getting Started" 的指引很直接:理解 iii 的最好方式是亲自试一下。两步:

  1. Install:安装 iii engine;
  2. Quickstart:搭建跨语言项目,组合 Python 与 TypeScript worker,并对运行中的系统零停机地增量加功能。

Quickstart 结尾还建议用iii console打开交互式控制台查看 workers、functions、triggers、logs、traces 与 state(详见 Console 文档)。

下一步阅读

docs/0-12-0/index.mdx是 0.12 版文档站的总入口,读完后建议按文档站自身的推荐顺序继续:

  • Understanding iii / Overview:用 Quickstart 实例拆解四个构件(Worker / Trigger / Function / Engine);
  • Workers 与 Engine:进程隔离、断连清理、配置热重载等运行细节;
  • Quickstart:从iii project init到跨语言调用、加 state、暴露 HTTP 的完整实战;
  • Engine 源码 与 协议定义:想看注册、路由与发现事件的实现时直接查这里。

需要提醒的适用前提:本文所有路径、命令与端口(ws://localhost:49134、HTTP:3111)均来自仓库docs/0-12-0/版本线与当前 Engine 源码,若升级 iii 版本,建议以对应版本的 安装指南 和 CHANGELOG 为准。

【免费下载链接】iiiEffortlessly compose, extend, and observe every service in real-time for the first time ever.项目地址: https://gitcode.com/GitHub_Trending/mo/iii

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询