2. 多租户模型基础:租户隔离策略与错误域划分

多租户(Multi-Tenancy)是 SaaS 架构的核心特征。一个物理实例需要同时服务多个租户(Tenant),而隔离策略直接决定了数据安全边界、资源争用程度以及错误传播半径。在错误处理框架中,隔离策略决定了“一个租户的故障是否会波及另一个租户”——即错误域(Error Domain)的划分粒度。

2.1 两大主流隔离策略:Schema-per-Tenant vs. Shared Schema

业界最常用的两种数据库层隔离模式对比如下:

维度 Schema-per-Tenant(独立模式) Shared Schema(共享模式)
数据隔离 每个租户拥有独立的数据库 Schema(或独立数据库实例) 所有租户共享同一张表,通过 tenant_id 列区分
错误域 窄:单个租户的慢查询、死锁、数据损坏不会影响其他租户 宽:一个租户的异常 SQL 可能锁表、耗尽连接池,导致全局故障
资源隔离 强:可为高价值租户分配独立连接池、独立 IOPS 弱:所有租户共享连接池与 IO 资源,存在“吵闹邻居”问题
运维复杂度 高:Schema 变更需逐租户执行,备份/恢复策略复杂 低:一次 DDL 影响所有租户,备份恢复简单
成本 高:每个租户占用独立存储与连接资源 低:单表可承载数千租户,资源利用率高
适用场景 金融、医疗等强合规行业;大客户定制需求 中小客户、标准化产品、对成本敏感的 SaaS
架构决策提示: 错误处理框架的熔断粒度必须与隔离策略对齐。Schema-per-Tenant 模式下,熔断可以精确到“单个租户的连接池”;Shared Schema 模式下,熔断必须升级到“全局连接池或表级限流”,否则一个租户的突发流量会拖垮所有租户。

2.2 错误域划分:从隔离策略到故障边界

错误域是指一个故障事件能够影响的最大范围。在多租户系统中,错误域划分直接由隔离策略决定:

  • Schema-per-Tenant 错误域:每个租户是一个独立的错误域。租户 A 的数据库连接池耗尽、死锁或数据损坏,不会传播到租户 B。熔断器可以按 tenant_id 维度独立统计失败率。
  • Shared Schema 错误域:所有租户共享同一个错误域。一张表上的行锁竞争、索引损坏或连接池枯竭,会同时影响所有租户。熔断器只能按全局维度或按 tenant_id 分组做软隔离(如限流),但无法做到物理隔离。

下图展示了两种策略下的错误域边界差异:

Schema-per-Tenant vs. Shared Schema 错误域对比 Schema-per-Tenant(独立错误域) 租户 A 独立 Schema 独立连接池 错误域 A 租户 B 独立 Schema 独立连接池 错误域 B ✕ 不传播 熔断粒度:按 tenant_id 独立熔断 故障影响范围:单个租户 Shared Schema(共享错误域) 共享表(tenant_id 列) 租户 A 数据 | 租户 B 数据 | 租户 C 数据 共享连接池 共享 IO / 锁资源 错误域:全局 故障传播到所有租户 熔断粒度:全局连接池或表级限流 故障影响范围:所有租户

2.3 混合策略:按租户等级分层隔离

实际生产环境中,纯 Schema-per-Tenant 或纯 Shared Schema 往往无法兼顾成本与隔离性。成熟的 SaaS 平台通常采用混合策略:

  • 黄金租户(Gold Tenant):使用 Schema-per-Tenant,分配独立连接池与独立错误域,熔断阈值可设置更宽松(如 50% 失败率才熔断)。
  • 标准租户(Standard Tenant):使用 Shared Schema,但按 tenant_id 做连接池分组(如每组 10 个连接),错误域缩小到“租户组”级别。
  • 免费租户(Free Tenant):使用 Shared Schema + 全局连接池,错误域为全局,熔断阈值更严格(如 10% 失败率即触发熔断)。
错误域划分原则: 隔离策略越强,错误域越小,熔断粒度越细,但成本越高。错误处理框架应支持多级熔断域:全局 → 租户组 → 单个租户,根据租户等级动态选择熔断粒度。

2.4 错误域划分对鉴权拦截链路的影响

在鉴权拦截链路中,错误域划分决定了熔断器应该放在哪里:

隔离策略 鉴权拦截链路熔断位置 熔断触发条件示例
Schema-per-Tenant 每个租户的鉴权服务实例或连接池 租户 A 的鉴权接口连续 10 次超时 → 仅熔断租户 A
Shared Schema 全局鉴权服务或共享数据源 全局鉴权接口错误率超过 20% → 熔断所有租户的鉴权
混合策略 按租户等级分层熔断(全局 + 租户组 + 单租户) 免费租户组错误率 15% → 熔断该组;黄金租户不受影响
常见陷阱: 在 Shared Schema 模式下,如果熔断器只按 tenant_id 做统计而不做物理隔离,一个租户的慢查询仍然可能耗尽连接池,导致其他租户的鉴权请求被阻塞。此时熔断器虽然“感知”到了错误,但无法阻止错误传播——因为共享连接池是全局资源。解决方案是引入租户级连接池隔离或异步限流队列。

2.5 本章小结

  • Schema-per-Tenant 提供窄错误域,适合高隔离需求,熔断粒度可精确到单租户。
  • Shared Schema 提供宽错误域,成本低但故障传播风险高,熔断必须全局化。
  • 混合策略 是生产环境的最佳实践,按租户等级分配不同的隔离级别与熔断阈值。
  • 错误域划分直接决定了鉴权拦截链路中熔断器的放置位置和统计维度,是后续章节设计熔断降级策略的基础。