恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

iii 如何用 namespaces 让多个项目在同一引擎上隔离运行并跨命名空间调用函数?

  • 首页
  • 资讯中心
  • /
  • iii 如何用 namespaces 让多个项目在同一引擎上隔离运行并跨命名空间调用函数?

相关资讯

Vector Lua Transform 实战:用 Lua 解析 CSV 日志(以 PostgreSQL csvlog 为例) 2026/9/14 6:58:16
Postman Mock Server实战:接口未就绪时如何高效联调 2026/9/14 6:58:16
C语言开发实战:从基础语法到项目应用 2026/9/14 6:58:16

最新资讯

冷热电联供系统(CCHP)原理与Python建模实践
pykan 正则化实战指南:用 reg_metric 与 lamb 让 KAN 更稀疏、更可解释
子网掩码原理与实战划分指南
Python环境配置避坑指南:PATH、pip虚拟环境与多版本管理
MCP Toolbox 的 firestore-get-rules 工具:安全规则检索的完整指南
ESP32蓝牙Beacon高精度测距实战:RSSI滤波与路径损耗建模

今日推荐

ASP+Access库存管理系统源码部署与IIS配置实战指南
基于SSM框架的毕业季旧物分类处理系统设计与实现
MATLAB FFT频谱仿真:从DFT原理到参数设置与窗函数选择

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

iii 如何用 namespaces 让多个项目在同一引擎上隔离运行并跨命名空间调用函数?

发布时间:2026/9/14 7:03:17
iii 如何用 namespaces 让多个项目在同一引擎上隔离运行并跨命名空间调用函数? iii 如何用 namespaces 让多个项目在同一引擎上隔离运行并跨命名空间调用函数【免费下载链接】iiiEffortlessly compose, extend, and observe every service in real-time for the first time ever.项目地址: https://gitcode.com/GitHub_Trending/mo/iii当两个以上的项目或租户共用一台 iii 引擎时会碰到一个具体问题如果两个项目都部署一个名叫state的 worker、都暴露state::get这个 function id引擎无法把调用路由到正确的项目。iii 的 namespace 机制就是为这个场景设计的namespace 是一个随 function id 和 worker 名一起存储的路由值不改变 id 本身state::get在default、orders、analytics里是同一个 id。本文给出在单个引擎上让多个项目按 namespace 隔离运行、并跨命名空间调用函数的完整操作路径如何给 worker 声明 namespace、如何用 compose 为每个项目起一个独立 daemon、如何用 CLI 和 SDK 发起跨命名空间调用以及如何核对结果和定位冲突错误。前提是你已经安装好 iii 并能启动引擎默认监听ws://localhost:49134安装方式见 install 文档。相关概念可参考 What a namespace is。一、先理解两条路由规则后面的操作都依赖这两条规则来自 Namespaces 概念文档引擎的注册表以(namespace, function_id)和(namespace, worker_name)为键同一个 id 或 worker 名在每个 namespace 内只能出现一次。一个 worker 连接只有一个 namespace它的函数、服务、trigger type 注册都落在该 namespace 下。调用路由是严格的带namespace: orders的调用只在orders里解析不会回退到其他 namespace。未命中时引擎返回function_not_found并在错误信息中列出该 function id 实际存在的 namespace协议文档给出的消息示例Function state::get not found in namespace default. It is registered in namespace(s): orders, analytics.。engine::*前缀的函数是引擎基础设施保留段只注册在default。自定义 worker 尝试在其他 namespace 注册engine::*id 会被引擎拒绝。二、给 worker 声明 namespaceSDK 按以下优先级决定 worker 的 namespace来源Use namespaces优先级来源1显式传入的namespaceSDK 选项2worker 进程环境变量III_NAMESPACE3defaultnamespace 必须是非空字符串传null、None或其他非字符串值会被 SDK 和引擎同时判为非法。省略选项时SDK 自己读III_NAMESPACE再回退到default。当应用代码必须指定 namespace 时用显式选项它优先于环境变量。各 SDK 写法以下代码均来自官方文档// Node / TypeScript import { registerWorker } from iii-sdk; const worker registerWorker(process.env.III_URL!, { workerName: state, namespace: orders, });# Python import os from iii import InitOptions, register_worker worker register_worker( os.environ[III_URL], InitOptions(worker_namestate, namespaceorders), )// Rust use iii_sdk::{InitOptions, register_worker}; let url std::env::var(III_URL).expect(III_URL must be set); let worker register_worker( url, InitOptions { namespace: Some(orders.into()), ..Default::default() }, );浏览器端 SDK 读不到进程环境必须显式传入 namespace或从可信的运行时配置获取import { registerWorker } from iii-browser-sdk; const worker registerWorker(ws://localhost:49135, { workerName: checkout-tab, namespace: orders, });三、为每个项目起一个 compose daemon用 compose 管理多 worker 项目时项目隔离由 daemon 的 namespace 完成。compose daemon 本身是一个 worker它以名字compose注册在自己的 namespace 下引擎把(namespace, compose)租约给一条连接因此同一引擎上可以有多个 daemon靠 namespace 区分但一个 namespace 只能由一个 daemon 服务来源Compose 文档。假设引擎已在ws://127.0.0.1:49134上运行为两个项目各开一个终端分别启动 daemon# 终端 1orders 项目 iii compose --namespace orders --engine ws://127.0.0.1:49134# 终端 2analytics 项目 iii compose --namespace analytics --engine ws://127.0.0.1:49134-n, --namespace NS的语义是该 daemon 在此 namespace 中响应compose::*并把它应用到加载的每个项目。--engine指定已存在的引擎地址覆盖 compose 文件和III_URL。如果没传--namespacedaemon 从worker-compose.yaml的namespace:继承文件也没有时落在default。然后在各自的项目目录里添加 workercompose::add是向对应 daemon 的 triggeriii trigger -n orders compose::add workerstate iii trigger -n analytics compose::add workerstate此时两个项目各有一个名为state的 worker分别落在orders和analyticsnamespace互不冲突。判断启动是否成功daemon 终端会打印每个 worker 的状态。Quickstart 中的文档示例输出长这样→ math-worker starting ✓ math-worker ready (2.1s) up: 1 of 1 changed in 2.1s如果第二个 daemon 试图占用已被服务的 namespace注册会被拒绝错误码为DAEMON_ALREADY_SERVING。注意一点环境限制worker 在容器或沙箱里运行时Linux 需要/dev/kvm访问权限报KVM not accessible时按 Troubleshooting 处理另外 worker 刚加入后需要一点时间安装运行时依赖若调用时报message: Function math::add not found等几秒再试。四、跨命名空间调用函数CLI 调用iii trigger的-n, --namespace NS参数指定在哪个 namespace 里解析 FUNCTION_PATH省略该参数时解析发生在引擎的defaultnamespace——CLI 调用没有自己的 namespace 可继承所以跨命名空间调用必须显式带这个 flag来源CLI referenceiii trigger --namespace orders state::get keycartSDK 内调用在 worker 代码里发起调用时在 invocation 上设置namespace字段调用只在该 namespace 内解析省略该字段时SDK 会填上调用方 worker 自己的 namespace无 namespace 的 worker 即defaultconst result await worker.trigger({ function_id: state::get, payload: { key: cart }, namespace: orders, });result worker.trigger({ function_id: state::get, payload: {key: cart}, namespace: orders, })use iii_sdk::protocol::TriggerRequest; use serde_json::json; let result worker .trigger( TriggerRequest { function_id: state::get.into(), payload: json!({ key: cart }), action: None, timeout_ms: None, } .namespace(orders), ) .await?;让 trigger 指向其他命名空间的函数registerTrigger默认把目标函数绑定到 worker 自己的 namespace要指向别处就显式设置namespace。最常见的情况是调用引擎内置函数——它们只存在于default// Bound to this workers namespace. worker.registerTrigger({ type: http, function_id: state::get, config: { api_path: /orders/state, http_method: GET }, }); // Bound to default, where the engines own functions live. worker.registerTrigger({ type: cron, function_id: engine::workers::list, config: { schedule: 0 * * * * }, namespace: default, });五、核对隔离与调用结果验证方式有两种来源Use namespaces 与 Engine protocol列表函数。engine::functions::list和engine::workers::list返回的每一行都带namespace字段两个函数不带 namespace 过滤参数、返回所有 namespace 的内容。用它确认state确实出现在orders和analytics两行中iii trigger engine::workers::list iii trigger engine::functions::list严格查询单个对象。info 函数接受namespace做严格查找iii trigger engine::workers::info --json {name:state,namespace:orders}不带 namespace 时engine::functions::info和engine::workers::info的解析规则是优先命中default条目没有default条目时名字只存在于一个 namespace 则解析到该处名字同时存在于多个 namespace 时返回歧义错误而不是猜测。调用结果本身也是核对手段跨命名空间调用返回正常结果说明路由正确误用错误的 namespace 调用会返回function_not_found且错误消息会列出该 function id 实际注册的 namespace可以直接据此改正 flag。六、常见错误与边界注册冲突。同一 namespace 内worker 名和 function id 各自只能有一个活跃 owner引擎拒绝第二个 owner 而不是替换现有 owner来源Namespaces 概念文档Code效果WORKER_NAMESPACE_CONFLICT致命。引擎关闭新连接SDK 不会重连。换 worker 名或 namespace 解决FUNCTION_NAMESPACE_CONFLICT非致命。引擎只拒绝这一个函数的注册worker 保持连接并继续服务其他函数。删除重复 function id或把一个 worker 挪到另一个 namespace需要特别注意worker 连接成功不代表它的所有函数都注册成功SDK 把函数冲突报告为 warning。如果你的 worker 要求每个函数都可用应把这个 warning 当作启动错误处理。daemon 抢占。同一引擎上两个 compose daemon 必须使用不同 namespace否则后到者收到DAEMON_ALREADY_SERVING被拒绝。注册窗口超时。引擎在 WebSocket 连接打开时启动一个 namespace 解析计时器默认5000 ms在计时器到期前engine::workers::register到达引擎按声明值分配 namespace缺省值即default如果超时先发生连接被固定到default之后迟到的注册也不能再改。要调整窗口在引擎进程环境里设置III_NAMESPACE_GRACE_MS或在config.yaml根节点设置registration_namespace_grace_ms来源Configurationregistration_namespace_grace_ms: 10000这个设置意味着 worker 进程如果启动过慢可能静默落回default从而触发上面的WORKER_NAMESPACE_CONFLICT。显式 null 非法。线上字段省略 namespace 与显式传null不是一回事省略按default处理显式null或非字符串值引擎会直接拒收该消息帧。用旧 SDK 构建、不带 namespace 字段的 worker 会落在default行为与引入 namespace 之前完全一致。RBAC 规则。如果项目使用iii-worker-manager的expose_functions规则不带 namespace 的规则只作用于default要暴露某个 namespaced 函数必须把精确的 namespace 写进规则参考 worker-manager 文档 中的 Namespace-scoped function rules 一节。按上述路径操作后engine::workers::list中可以看到同一 worker 名出现在不同namespace行里跨命名空间 trigger 能拿到正确结果说明隔离与调用都已就位。【免费下载链接】iiiEffortlessly compose, extend, and observe every service in real-time for the first time ever.项目地址: https://gitcode.com/GitHub_Trending/mo/iii创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号