一个系统宣布“支持多租户”的那天,往往只是完成了最显眼的那层改造。真正的工作,是在之后一个角落一个角落地把隔离补进去。
今天做的事,大部分都属于后者。
一、隔离永远差一张表
上一阶段,我们完成了技能、记忆、凭证、用户画像的隔离。但系统里的资源不止这些——工作流、意图、节点、模型配置、系统级连接,原来全是全局共享的。
这一批,把这些资源全部补上了组织归属。数据库层面新增了多张表的组织维度,并调整了一些之前设计成“全局唯一”但其实应该“按组织唯一”的约束。
多租户改造的规律大概是这样:你以为改完了,新增一个资源,就又差一个角落。

二、数据库开了权限,却忘了告诉它你是谁
我们的数据库启用了行级安全策略——每条查询只返回属于当前组织的数据,不同租户之间物理隔离。
但有几处查询,调用方忘记了在请求里声明自己的组织身份。权限策略是开着的,但没有身份,就等同于“没有权限”——查询正常执行,返回空,不报错,数据就这么静悄悄地读不到了。
图定义、节点模板、自定义节点加载器,三处补上了显式身份注入,开启权限策略后这几块读取才真正恢复正常。
这类问题的特点是:不报错,只是不工作。比报错更难发现。

三、技能配了,Agent 却用不到
这个问题让人困惑:明明给 Agent 配置了技能,运行的时候它就是用不到,或者只能识别一部分,剩下的“消失”了。
追下去,发现是三处同时出了问题——
Agent 启动的时候,没有自动发现当前组织下有哪些技能可用;技能列表更新了,运行中的 Agent 不感知,要重启才能看到;另外,上一版加进去的注入上限,在某些情况下截断得太激进,导致技能列表后半段直接被切掉了。
三处一起修:自动发现接入、变更实时感知、截断默认关闭。
任意一处没修,结论都一样:技能配了等于没配。

四、每个租户,用自己的品牌
新增了组织级的品牌配置——Logo、品牌色。登录页、侧边栏、聊天界面、设置页,全部适配。
用户打开系统看到的,是客户自己的品牌,不是平台的品牌。
做 SaaS 到最后,技术层面的区分度会越来越小,品牌和体验上的贴合度反而成了留住客户的东西。

五、构建从玄学变回工程
构建流程这段时间出现了两个问题,性质不同,根因类似——都是在依赖外部的东西。
一个是自动化测试用的浏览器组件从网络拉取,CDN 偶发抖动,构建随机失败,复现不稳定,每次都要重跑,不知道是代码问题还是网络问题。改成从本地缓存复制,彻底去掉对网络的依赖。
另一个是前端编译开了严格检查,有一个变量声明了但没用到,直接阻塞了镜像构建。清掉这个变量,编译恢复通过。
顺带,把构建时产生的缓存目录从镜像里排除出去,后端镜像从 6.1GB 降到 5.2GB。
构建随机失败一次,损失的不只是时间,还有对系统状态的信心。

今天没有新功能上线,全是这类工作。
但 “宣布支持多租户”和“真正跑通多租户”之间,靠的就是这些。
这,是第五十天。
《从0到1:企业级AI项目迭代日记》记录一个企业级 AI 项目从创意、架构到落地的真实过程。不讲神话,只记录进化。
如果你也在做企业 AI 落地,欢迎留言来聊。或者,把这篇转发给一个正在踩同样坑的朋友。
762

被折叠的 条评论
为什么被折叠?



