Q:系统里多租户隔离是怎么实现的?
来源:视频面经汇总
新手答:“每个租户一个数据库。”
高手答:
多租户隔离的方案取决于隔离强度和运维成本的权衡:
| 方案 | 隔离强度 | 成本 | 适用场景 |
|---|---|---|---|
| 独立数据库 | 最强 | 最高 | 金融/医疗等强合规 |
| 共享库+独立 Schema | 中等 | 中等 | SaaS 中型客户 |
| 共享表+tenant_id 字段 | 最弱 | 最低 | 通用 SaaS 平台 |
在 Agent/RAG 系统中,我们用的是逻辑隔离方案:
- 数据层:向量数据库用
collection_id或 metadata 中的tenant_id做过滤,检索时强制注入 tenant 条件,SQL 层面 WHERE 子句必加 - 模型层:System Prompt 注入租户专属规则和知识范围边界,不同租户可配置不同的 Skill 集合和工具权限
- 接口层:API Gateway 做认证 + 租户路由,token 解析后注入 tenant context 到请求上下文,下游服务无感
- 存储层:向量库索引按租户分 partition(Milvus 的 partition_key),文件存储用
/\{tenant_id\}/前缀隔离
防泄漏关键点:
- 检索时 tenant_id 过滤放在向量数据库的 filter 条件中(非应用层过滤),避免先召回再过滤导致的信息泄漏
- 日志脱敏:跨租户的 trace 信息不能出现其他租户数据
- 压测:专门做跨租户渗透测试(tenant A 是否能检索到 tenant B 的文档)
差距在哪:新手只想到“分库”——这是最暴力也最贵的方案。高手按数据层/模型层/接口层/存储层分层设计,说明理解了 Agent 系统中多租户不只是数据库的问题,还涉及向量检索、Prompt 注入和权限管控。