1. SaaS多租户概述

1.1 什么是多租户

多租户(Multi-Tenancy)是一种软件架构模式,其中单个软件实例能够同时为多个租户提供服务。每个租户(Tenant)代表一个客户组织(企业、团队或个人),在逻辑上相互隔离,彼此无法感知或访问对方的数据。

核心特征: 共享实例 + 逻辑隔离 = 多租户架构。与单租户(每个客户独立部署实例)相比,多租户在资源利用率、运维成本和版本一致性上具有显著优势。

多租户并非简单的"多个用户登录系统"。用户(User)是租户下的身份实体,而租户是数据隔离与计费的边界。例如:企业A和企业B都是租户,企业A的员工张三和企业B的员工李四分别是各自租户下的用户。

1.2 租户隔离模型

根据数据隔离的粒度与共享程度,业界主流有三种隔离模型。下表从多个维度进行对比:

维度 Database-per-Tenant Schema-per-Tenant Shared Table
隔离粒度 独立数据库 同一数据库,独立Schema 同一数据库,同一Schema
数据安全 最高(物理隔离) 高(逻辑隔离) 中等(依赖租户ID字段)
资源成本 最高(每租户独立DB连接) 中等 最低(共享连接与存储)
扩展性 强(可独立迁移/备份) 中等 弱(单表数据量增长快)
租户数量上限 数百~数千 数千~数万 数万~百万级
典型场景 金融、医疗等强合规行业 中型SaaS平台 超大规模、低客单价SaaS
选型建议: 没有绝对最优模型。成熟SaaS平台通常采用混合策略:免费/试用租户使用Shared Table,付费高等级租户自动升级到独立Database。

三种模型的架构关系如下图所示:

三种租户隔离模型对比 三种租户隔离模型架构对比 Database-per-Tenant App Instance (共享应用层) 租户A → DB_A 租户B → DB_B 租户C → DB_C 隔离等级:最高 成本:最高 Schema-per-Tenant App Instance (共享应用层) Shared DB Schema_A Schema_B Schema_C 隔离等级:高 / 成本:中 Shared Table App Instance (共享应用层) Shared DB orders 表 tenant_id | order_id | ... (所有租户数据混存) 隔离等级:中 成本:最低

1.3 SaaS架构核心挑战

多租户架构在带来资源集约优势的同时,也引入了传统单租户架构不曾面临的系统性挑战。以下是SaaS架构必须解决的五大核心问题:

  1. 租户身份识别与路由: 请求到达时,系统必须准确识别请求属于哪个租户,并将该请求路由到正确的数据源或Schema。常见的识别方式包括域名前缀(tenant-a.example.com)、请求头(X-Tenant-ID)或URL路径。
  2. 数据隔离与安全: 必须防止租户A通过SQL注入、参数篡改或缓存穿透等方式访问租户B的数据。隔离失效是SaaS平台最严重的安全事故。
  3. 资源配额与限流: 一个租户的突发流量(如"双11"大促)不应影响其他租户的正常使用。需要为每个租户设置独立的QPS、连接数、存储空间等配额。
  4. 租户级配置与定制: 不同租户可能要求不同的功能开关、UI主题、业务规则或集成配置。架构需要支持运行时动态加载租户配置。
  5. 运维与监控复杂度: 在共享基础设施上,需要区分"全局故障"与"单租户故障"。监控系统必须能按租户维度聚合日志、指标和告警。
常见误区: 许多团队在SaaS初期选择Shared Table模型以降低开发成本,但忽略了租户ID索引设计和数据清理策略。当租户数量超过1000、单表数据量突破1亿行时,查询性能会急剧下降,且数据迁移成本极高。建议在架构设计阶段就预留隔离升级路径。

下图展示了SaaS架构在鉴权与数据访问链路中面临的核心挑战分布:

SaaS架构核心挑战链路图 SaaS架构核心挑战链路 客户端请求 挑战① 租户身份识别与路由 域名 / Header / URL → 确定 tenant_id 挑战② 鉴权与数据隔离 Session校验 + 跨租户数据防护 挑战③ 资源配额 / 限流 / 运维监控 QPS限制 | 连接池隔离 | 按租户维度告警