前言

多租户 SaaS 关注的是“多个客户共用一套系统,但数据、权限、配置互相隔离”。面试常问:

  • 租户 ID 从哪里来。
  • 数据怎么隔离。
  • 租户配置怎么管理。
  • 不同套餐怎么限制功能。
  • 怎么避免跨租户数据泄漏。

租户识别

常见方式:

  • 域名识别:tenantA.example.com
  • Token 中携带 tenantId。
  • 请求头携带 tenantId。
  • 登录后绑定租户上下文。

后端要把 tenantId 放入统一上下文,供权限、数据查询、日志审计使用。

数据隔离方案

方案 优点 缺点
独立数据库 隔离强 成本高
独立 schema 隔离较好 运维复杂
共享表加 tenant_id 成本低 隔离依赖代码和权限

中小 SaaS 常用共享表加 tenant_id,大型客户可能独立库。

查询隔离

共享表方案必须保证所有查询都带租户条件:

1
2
select * from orders
where tenant_id = ? and order_no = ?;

建议:

  • ORM 拦截器自动追加 tenantId。
  • 敏感表强制租户字段。
  • 管理后台超管权限单独控制。

配置隔离

不同租户可能有不同:

  • Logo。
  • 菜单。
  • 功能开关。
  • 流程规则。
  • 字段配置。
  • 通知模板。

配置要支持租户维度覆盖默认配置。

套餐限制

SaaS 常见套餐:

  • 用户数上限。
  • 存储空间上限。
  • API 调用次数。
  • 功能模块开关。
  • 数据保留周期。

套餐限制建议在网关、业务服务和定时任务多个位置做校验。

租户级限流

不能只按全局限流,否则大租户可能挤压小租户。

常见维度:

  • 租户 QPS。
  • 租户并发数。
  • 租户任务数。
  • 租户存储容量。

高频面试题

多租户最大风险是什么?

跨租户数据泄漏。要从查询条件、权限、日志、缓存 key、文件路径、消息 topic 等多个位置隔离。

缓存 key 怎么设计?

必须带 tenantId,例如 tenant:{tenantId}:user:{userId}

大客户要求独立部署怎么办?

可以支持混合模式:普通租户共享集群,大客户独立数据库或独立部署。

多租户和 RBAC 有什么关系?

RBAC 解决租户内部权限,多租户解决租户之间隔离,两者要组合。

总结

多租户 SaaS 的核心是租户识别、数据隔离、权限隔离、配置隔离和资源隔离。面试回答一定要强调 tenantId 贯穿全链路,不能只在表里加一个字段。