news 2026/9/13 4:32:31

iii Worker Registry:三种 Worker 安装来源、制品类型与源码级解析机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
iii Worker Registry:三种 Worker 安装来源、制品类型与源码级解析机制

iii Worker Registry:三种 Worker 安装来源、制品类型与源码级解析机制

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

本文基于 iii 官方文档《Worker Registry》展开,讲清楚 iii 的 Worker Registry 是什么、如何用iii worker add从三种来源(注册表名称、本地路径、Docker/OCI 镜像)安装 worker,以及 worker 的制品类型与版本固定机制。结合 iii 仓库中iii-workerCLI 的实际解析源码,本文进一步还原iii worker add背后的注册表解析、依赖图下载与iii.lock锁文件流程,使你在完成 worker 安装实操的同时,能够理解每一步命令在引擎内真实发生的事。

一、什么是 iii Worker Registry

iii 的 Worker Registry(注册表地址为 workers.iii.dev,是外部站点,此处仅作名词说明)是全部可安装 worker 的索引。每个 worker 的页面会列出以下关键信息:

  • 该 worker 提供的functions(可被触发调用的函数)与trigger types(触发器类型);
  • 该 worker 的配置 schema(配置字段的结构与取值);
  • 支持的平台(macOS / Linux / Windows 等);
  • 随 worker 附带的agent skills(供 AI Agent 使用的技能条目)。

实际使用时的检索思路是:先明确项目需要的一种能力(例如 HTTP 端点、队列、状态存储),再到注册表页面中按“函数 / 触发器 / 配置”三要素定位满足该能力的 worker。

除了官方注册表,worker 还可以发布在Docker 与 OCI 兼容的镜像仓库中——这直接对应后文iii worker add的第三种来源。CLI 源码中同样内置了注册表地址作为引导信息,见 engine/src/trigger.rs。

二、iii worker add:三种 worker 来源

iii worker add接受三种来源。在所有情况下,worker 都会被写入项目根目录的config.yaml并自动启动,无需手动配置启动项:

iii worker add iii-state # 来源 1:注册表名称 iii worker add ./workers/my-worker # 来源 2:本地路径 iii worker add ghcr.io/org/worker:tag # 来源 3:Docker 或 OCI 镜像

三种来源的含义:

来源适用场景解析行为(结合源码可确认)
注册表名称使用官方/社区发布的现成 worker调用注册表 API 解析出制品类型、版本与下载地址,见下文“注册表解析机制”
本地路径自研 worker 的开发调试以目录形式接入,走本地 worker 安装通道(相关实现位于 crates/iii-worker/src/cli/local_worker.rs)
Docker/OCI 镜像自托管或第三方镜像仓库中发布的 worker解析镜像引用(参考 crates/iii-worker/src/cli/oci_ref.rs),在任何受支持平台上以镜像方式运行

一个真实可参考的配置形态来自引擎内置的queueworker 文档:通过package://协议 URL 从注册表解析 worker,并显式写死version字段,见 engine/src/workers/queue/README.md:

containers: queue: worker: package://api.workers.iii.dev/queue version: "0.21.5" config_name: queue

版本固定(pinning)与更新

注册表中的 worker 以semver 版本号发布。不指定版本时安装最新发布版;在名称后附加@<version>可固定特定版本:

iii worker add iii-state@1.2.0 # 固定到 1.2.0

name@version的拆分在源码中由parse_worker_input完成——以第一个@为界切分为名称与版本两部分,不带@则版本为None(取最新),见 crates/iii-worker/src/cli/registry.rs。

固定下来的版本会记录进项目根目录的iii.lock锁文件,之后每次安装都按锁文件回放,保证同一 iii 系统部署在不同机器上可复现。更新则用iii worker update <name>(单个)或iii worker update(全部锁定 worker)重新解析并回写iii.lock。更多版本与更新细节见 docs/0-12-0/using-iii/workers.mdx 中的“Versioning and pinning”与“Updating a worker”小节。

其他相关子命令速查

完整的iii worker子命令集(start / stop / restart / remove / clear / sync / verify 等)在 docs/0-12-0/using-iii/workers.mdx 有完整说明,与注册表安装流程直接相关的几条:

iii worker reinstall <name> # 强制重新下载(等价于 add --force) iii worker remove <worker-name> # 从 config.yaml 移除并停止进程 iii worker sync # 严格按 iii.lock 安装 iii worker sync --frozen # CI 形态:只校验锁文件,不修改本地文件 iii worker verify # 报告 config.yaml 与 iii.lock 之间的漂移

三、制品类型:文档口径与源码中的完整枚举

原文档的口径是:每个注册表 worker 以原生二进制(按 macOS、Linux、Windows 提供各平台制品)或Docker/OCI 兼容镜像(运行于所有受支持平台)两种方式之一发布。

从源码结构看,CLI 实际识别的制品类型比文档口径更细。WorkerInfoResponse是一个按type字段区分的四元枚举,见 crates/iii-worker/src/cli/registry.rs:

#[serde(tag = "type")] pub enum WorkerInfoResponse { #[serde(rename = "binary")] Binary(BinaryWorkerResponse), // 原生二进制:各平台 URL + sha256 #[serde(rename = "image")] Oci(OciWorkerResponse), // OCI/Docker 镜像:image_url #[serde(rename = "engine")] Engine(EngineWorkerResponse), // 引擎内置 worker:仅名称与版本 #[serde(rename = "bundle")] Bundle(BundleWorkerResponse), // 打包目录:tar.gz 归档 + sha256 }

各类型的载荷字段与安装行为(均以源码注释为准):

  • binarybinaries为“平台 → {url, sha256}”的映射,下载后按 sha256 校验;
  • image:只有image_url,跨平台统一运行;
  • engine:随 iii 引擎本体发布的内置 worker,无需下载制品;
  • bundle:打包好的 local-worker 目录 tar.gz 归档,归档根必须包含iii.worker.yaml,引擎下载、校验 sha256、原子解压后通过 libkrun 沙箱运行,见 crates/iii-worker/src/cli/registry.rs 的注释。

引擎自身维护的iii.lock就是一个 engine 类型的真实样例,见 engine/iii.lock:

version: 1 workers: iii-http: version: 0.13.0-next.1 type: engine dependencies: {}

二进制工件的平台覆盖

“按平台提供制品”这一点在引擎的托管二进制注册表中可直接验证。engine/src/cli/registry.rs 中的REGISTRY静态表为每个托管二进制声明了supported_targets,覆盖aarch64-apple-darwinx86_64-apple-darwinx86_64-unknown-linux-gnux86_64-unknown-linux-muslaarch64-unknown-linux-gnu及 Windows MSVC 目标;has_checksum: true表明各平台制品均附校验和。该表中的iii-worker条目把iii worker子命令整体映射到独立二进制(CommandMapping { cli_command: "worker" }),说明iii worker add的执行体是随 iii 分发、按需解析平台制品的iii-worker程序。

四、iii worker add <名称>的注册表解析机制

当来源是注册表名称时,CLI 端有一个完整的“解析 → 校验 → 下载 → 写锁”流水线,核心在 crates/iii-worker/src/cli/registry.rs。

1. 端点与安全边界。默认 API 基址为https://api.workers.iii.dev(registry.rs#L15),可通过环境变量III_API_URL覆盖;仅调试构建支持file://指向本地 fixture 文件,用于离线/测试场景(registry.rs#L190-L219)。注册表 JSON 响应有 1 MiB 的大小上限(MAX_REGISTRY_RESPONSE_BYTES),目的是在依赖安全检查与下载字节上限生效之前,先防止不可信注册表造成无界内存分配(registry.rs#L16-L22)。

2. 名称校验。worker 名称只允许字母、数字、短横线、下划线和点,且禁止以.开头、禁止..。源码注释解释了原因:bundle 安装根目录保留.locks.staging两个内部控制目录,以点开头的 worker 名会在磁盘上遮蔽它们,因此直接拒绝(registry.rs#L170-L179)。

3. 版本查询参数。请求形如GET /download/{name};带版本时附加?version=<v>;在 CI 环境(探测GITHUB_ACTIONSCIJENKINS_URL等标准变量)中附加ci=true,见with_download_query(registry.rs#L54-L64)。

4. 依赖图解析。单个 worker 不是孤立下载的。解析结果ResolvedWorkerGraph包含根节点(root)、按版本解析出的 worker 列表(graph,每项含名称、类型、版本、制品地址、依赖映射)与依赖边(edges,含语义化版本范围range),见 registry.rs#L128-L168。这意味着执行iii worker add iii-state时,该 worker 声明的依赖会被一并解析安装;对 bundle 类型,锁文件路径强制要求archive_urlsha256同时存在,防止安装退化为不可校验的拉取(registry.rs#L141-L150)。

5. 锁文件落盘。解析结果最终写入项目根目录的iii.lock。锁文件模块维护一个 format version(当前version: 1),写入采用“相邻临时文件 + 原子替换”,避免半写文件;读取时执行validate(),不支持的 format 版本会被直接拒绝。相关实现与测试见 crates/iii-worker/src/cli/lockfile.rs,测试覆盖了往返序列化、版本校验(拒绝version: 2)、原子写入不留临时文件等场景(lockfile.rs#L678-L800)。

由此可以把文档中的一句话——“worker 被加入config.yaml并自动启动”——展开为完整链路:

iii worker add iii-state@1.2.0 → parse_worker_input 拆分名称/版本 → validate_worker_name 名称校验 → GET https://api.workers.iii.dev/download/iii-state?version=1.2.0 → 按 type 解析制品(binary/image/engine/bundle) → 展开依赖图(graph + edges),下载并校验 sha256 → 写入/更新 config.yaml,落盘 iii.lock → 引擎启动该 worker,WebSocket 连上后可见其函数与触发器

worker 通过 WebSocket 连上引擎后即可被整个系统与所有其他 worker 发现;断连后其函数与触发器停止可调用,直至重连,见 docs/0-12-0/using-iii/workers.mdx 的“Worker lifecycle”一节。

五、实操建议与适用范围

  1. 可复现部署:把iii.lockconfig.yaml一起提交到版本库;CI 流水线使用iii worker sync --frozen校验而不改写文件。
  2. 版本策略:开发期可不带版本跟随最新;生产环境用@<version>固定,升级走iii worker update,变更集中体现在iii.lockdiff 中。
  3. 来源选择:官方/社区能力优先注册表名称;本地迭代用路径来源;私有仓库或自托管发行用 OCI 镜像引用。
  4. 平台前提:binary 制品受各 worker 声明的平台目标约束(Linux gnu/musl、macOS aarch64/x86_64 等,可参照 engine/src/cli/registry.rs 的目标清单);跨平台一致性要求高的场景可优先选 image 制品。
  5. 适用版本说明:本文基于 iii 仓库 0.12.0 文档目录(docs/0-12-0/using-iii/workers-registry.mdx)与当前iii-workerCLI 源码撰写;原文档中标注的“LLM 浏览注册表”能力尚在 skills worker 中待稳定,暂不作为可用特性描述。

延伸阅读

  • 原文档(skill 渲染版):docs/0-12-0/using-iii/workers-registry.mdx.skill.md
  • Workers 全生命周期与锁文件命令:docs/0-12-0/using-iii/workers.mdx
  • 注册表解析与依赖图实现:crates/iii-worker/src/cli/registry.rs
  • 锁文件读写与校验:crates/iii-worker/src/cli/lockfile.rs
  • 托管二进制平台注册表:engine/src/cli/registry.rs
  • 引擎内锁文件实例:engine/iii.lock

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:32:01

合宙CC表反接烧毁原理与维修实战指南

1. 项目概述&#xff1a;一次真实的合宙CC表反接事故复盘 合宙CC表——这个在物联网终端、智能电表、工业数据采集场景里被大量使用的国产模组化计量设备&#xff0c;最近在我手头的一批现场调试项目中&#xff0c;突然集中暴露出一个看似低级却后果严重的共性问题&#xff1a;…

作者头像 李华
网站建设 2026/9/13 4:31:02

SpringBoot+Vue全栈开发读书笔记共享平台实践

1. 项目背景与核心价值去年我在某高校信息化部门参与智慧校园建设时&#xff0c;发现学生群体存在一个普遍痛点&#xff1a;不同专业、年级的学生在阅读相同书籍时&#xff0c;往往需要重复整理相似的读书笔记。这促使我萌生了开发读书笔记共享平台的想法。这个基于SpringBootV…

作者头像 李华
网站建设 2026/9/13 4:30:18

Flutter与OpenHarmony表单验证:formz库实战解析

1. 项目背景与核心价值在跨平台应用开发领域&#xff0c;Flutter与OpenHarmony的结合正在开辟新的技术路径。表单作为人机交互的核心载体&#xff0c;其验证逻辑的复杂度往往随着业务增长呈指数级上升。传统Flutter表单开发存在三个典型痛点&#xff1a;验证逻辑与UI强耦合导致…

作者头像 李华
网站建设 2026/9/13 4:27:41

Motor CAD 8极48槽永磁同步电机振动噪声分析流程详解

做电机设计这些年&#xff0c;前期被电磁方案折磨得够呛&#xff0c;后期发现振动噪声更让人头大。客户要的从来不只是“能转”&#xff0c;而是“安静地转”、“稳定地转”。不少朋友问我&#xff0c;手头没有全套测试设备&#xff0c;怎么在设计阶段就把NVH问题挡在门外&…

作者头像 李华
网站建设 2026/9/13 4:22:27

电子货架标签为何必须用石英晶振?低功耗精准时序的底层逻辑

1. 为什么电子货架标签&#xff08;ESL&#xff09;里非得塞进一颗晶振&#xff1f;——从拆解实录讲起你拆过电子货架标签吗&#xff1f;不是那种扫码看参数的“伪拆解”&#xff0c;而是真刀真枪撬开外壳、焊下PCB、用放大镜盯住每一颗元件的那种。我上周刚拆了三款市面主流E…

作者头像 李华