优尼沃OS工程手记:从单体架构到主权智能体集群的改造总结

优尼沃OS工程手记:从单体架构到主权智能体集群的改造总结

改造前的真实状态

优尼沃OS 最初的 Agent 执行层是一个典型单体:一个进程里跑所有任务,模型调用、工具执行、状态管理、队列消费搅在同一份代码里。业务量小的时候一切安好,问题随规模而来------一个客户的批量任务把内存吃满,所有客户的任务一起卡死;改一个工具的鉴权逻辑,回归测试要覆盖全部业务流。改造目标很朴素:把"智能体"从进程里的代码路径,变成可独立部署、独立授权、独立观测的运行单元。我们称之为主权智能体集群:每个智能体对自己的能力、密钥与状态负责,集群负责调度与协作。

第一步:拆出能力边界,而不是拆服务

改造最大的坑是按技术层拆分(把模型调用、存储、队列各拆一个服务),拆完耦合更重。正确的切入是按能力域拆:每个智能体绑定一组工具、一段密钥作用域、一类业务状态。判定标准是授权最小化------任何一次任务执行,只触及该智能体声明的能力清单:

yaml 复制代码
agent: fin_report_agent
tools: [db_query_ro, report_render, mail_send]
secrets_scope: [fin_ro]
state_store: fin_agent_state

工具清单、密钥作用域、状态存储三者对齐到同一个智能体名下,鉴权校验从"全局看这个用户行不行"变成"这个智能体此刻被授权用什么"。

第二步:通信协议先于实现

集群化的智能体之间必须协作,协作协议没定好,各智能体会长出私有的通信习惯,最后谁也改不动。我们先定了三条协议规则再写代码:智能体间调用一律走消息总线且带任务上下文 ID;跨智能体的委托关系显式声明(谁可以委托谁、委托的权限上界),不允许运行期动态扩权;所有消息可回放,重放同一段消息序列要能复原同样的执行轨迹。协议定稿花了两周,此后八个月的迭代没有再动过它------这是整个改造里回报率最高的投入。

第三步:状态所有权与故障半径

单体时代所有状态在一个库里,一个模块的 bug 能污染所有人的数据。集群化后每个智能体的状态隔离在自己的存储域,跨域读取走显式接口而不是直连数据库。改造完成半年后的一次事故验证了价值:某个数据处理智能体的逻辑错误把自己的状态表写坏,故障半径就是它自己------重建状态、隔离重放,其他智能体的任务全程无感知。单体时代同等事故的处理时长是半天,这次是四十分钟。

迁移路径:绞杀者模式而非大爆炸

我们用绞杀者模式迁移:新集群先承接新增业务流,旧单体按流量逐条割接,每条业务流双跑一周比对输出一致性后切换。全程约四个月,期间单体与新集群并行,没有一次停机窗口。双跑比对暴露过六处行为差异,全部是旧单体里从未被发现的隐性逻辑(如超时后的静默重试),迁移过程顺便完成了一次行为审计。

改造后才体会到的三件事

一是观测体系的地位被低估了:集群化后故障模式从"进程崩了"变成"协作链路某环慢了",没有全链路任务追踪根本无法排查,任务上下文 ID 贯穿所有日志是刚需。二是成本可见性:每个智能体独立计量模型调用与工具消耗后,才看清各业务流的真实成本结构,两处长尾任务因此被下线。三是团队协作方式随之改变:智能体的能力清单成为产品与工程对齐的通用语言,需求评审直接对着清单讨论边界,不再各说各话。

小结

从单体到主权智能体集群,技术动作只有三个:按能力域拆分、协议先行、状态所有权隔离;但改造的成败更多取决于顺序------先定协议再写实现,先做观测再扩规模,先双跑再切流量。集群化不是终点,它买来的是下一步的自由度:智能体的独立演进、按需扩缩与细粒度授权,都是单体时代想都不用想的事。

相关推荐
特立独行的猫A3 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈6 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
爱学习的程序媛9 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing9 小时前
Agent核心内容
后端·ai·langchain
budingxiaomoli10 小时前
Spring统一功能处理
java·后端·spring
某鹏11 小时前
网关选型:Go、Java、Graal 谁都不能完胜
后端
用户02478365309711 小时前
从屎山到防线:14 行状态迁移表,给任务系统装上防瞎跳闸门
后端
CQU_JIAKE11 小时前
11.13[体系结构】指标,五级流水线,八级流水线,虚实地址思考
后端
panbook13 小时前
从0到1实现一个分布式时序数据库(三):主从复制、故障检测与切换
后端
上线再说13 小时前
图片从 8.2MB 压到 296KB:我把小程序图片链路的账单拆了一遍
后端