跳到主要内容
约 4 分钟2 张卡

多租户

多租户系统共享基础设施,并隔离各租户的数据与资源。本文讲解身份传播、授权、配额和运维边界。

1. 面试核心​

先记住这几条,再读正文
  • 身份与授权。 租户身份与用户身份分开,授权验证用户的租户成员关系。
  • 隔离模式。 Pool 共享资源,Silo 使用专用资源,Bridge 混合两种模式。
  • 数据范围。 租户内唯一约束需包含租户键,缓存与消息也需隔离。卡 · 综合题
  • 资源配额。 租户配额和公平调度限制噪声邻居的影响。
  • 行级安全。 行级安全依赖执行角色,超级用户和 BYPASSRLS 角色会绕过策略。卡 · 行级安全与连接复用

2. 租户身份​

租户可以是客户组织、团队或项目。一个用户可属于多个租户,因此请求需明确当前租户。

租户上下文来自验证后的令牌或服务端会话。客户端选择租户后,服务端校验成员关系。后台任务、消息和审计也要带上明确范围。范围缺失时默认拒绝。

3. 隔离模型​

Pool 让租户共享应用与存储,以租户字段区分数据。Silo 为租户配置专用应用或存储。Bridge 按租户或组件混合使用两种方案。

共享池提高资源利用率,故障影响也更集中。专用资源增加部署与升级成本。选择需结合租户规模、性能要求和合同约束。

独立 schema 提供命名与权限边界。若仍共享数据库实例,CPU 和连接压力仍会相互影响。

4. 授权检查​

认证确认用户身份,授权确认当前租户内的权限。请求依次验证令牌、成员关系和资源归属。审计记录主体、租户、资源与结果。

全局管理员使用独立权限与完整审计。普通租户角色只访问自身范围。

5. 数据访问​

共享表的租户键应非空。订单号若只在租户内唯一,可使用复合唯一索引:

CREATE UNIQUE INDEX uk_order_no
ON orders (tenant_id, order_no);

不同租户可以使用相同订单号。同一租户重复插入时触发约束。跨表引用也应校验两侧租户一致。

查询可通过 Repository、ORM filter 或行级安全统一过滤。缓存键、对象路径、搜索索引和消息同样需要租户维度。

5.1 行级安全与连接复用​

PostgreSQL 18 的 RLS 在数据库侧过滤行。启用 RLS 而无适用策略时,普通访问默认拒绝。USING 控制可见行,WITH CHECK 校验新增或修改后的行。

超级用户和 BYPASSRLS 角色会绕过 RLS。表所有者默认也绕过,可用 FORCE ROW LEVEL SECURITY 约束。应用连接应使用受策略约束的角色。

连接池会把物理连接交给下一个请求。若用会话变量存租户上下文,可用 SET LOCAL 限定到事务。提交或回滚后,临时设置恢复为会话原值。会话默认值应无租户权限。异常回滚后也要验证租户 A 的连接可安全交给 B。

RLS 是数据层防线,用户与租户的授权仍由可信入口完成。

6. 配额​

租户配额约束请求速率、并发数和排队长度。存储、CPU、内存和第三方调用也可设限。

全局上限保护总容量。租户上限减少单方占满资源的机会。公平调度决定拥塞时谁先取得资源。公共控制面和核心任务还需保留容量。

7. 噪声邻居​

慢 SQL、热点分区和缓存淘汰都会跨租户传播压力。诊断应按租户观察延迟、错误和资源用量。

查询限时、有界队列和并发隔离可限制影响。大租户可迁移到独立资源池。配额应与产品套餐和容量计划一致。

8. 运维隔离​

发布、数据迁移与回填按租户批次推进。小范围验证后再扩大影响面。工具执行前展示目标范围和预估数据量。

单租户导出、删除与恢复也需隔离。恢复共享备份时,可先在隔离环境提取目标数据。校验后再通过受控流程写回。

9. 成本归因​

租户资源用量可作为共享费用的分摊依据,口径与计算见成本归因。

10. 跨租户测试​

测试至少覆盖以下边界:

  • 伪造、缺失或切换租户 ID。
  • 两个租户使用相同业务资源 ID。
  • 缓存、搜索和消息中的数据隔离。
  • 管理员路径与权限撤销。
  • 单租户占满并发、队列或存储。
  • 导出、恢复、迁移和连接复用后的范围。

共享资源压测还需观察其他租户的 SLO。

11 · 面试题卡片​

11.1 多租户系统怎样避免数据越权和单个租户占满资源​

出现公司:网易严选

题型:综合题

考察重点

  • 租户身份、授权和数据过滤的完整链路。
  • Pool、Silo 与混合隔离模型。
  • 按租户配额、噪声邻居和可观测性。

相关内容:租户身份至跨租户测试。

参考回答

用可信租户上下文和授权控制数据范围,用租户配额与公平调度限制资源占用。

请求先验证用户的租户成员关系,数据访问、缓存和消息沿用同一范围,唯一约束按业务定义包含租户键。

资源侧分别设置速率、并发和存储配额;大租户可使用独立资源。测试覆盖越权、连接复用时的上下文残留,以及单个租户拖慢其他租户的情况。

11.2 启用数据库行级安全后,为什么还会发生跨租户访问?​

出现公司:暂无已核验的公开来源(本站自测)

考察重点:角色绕过、策略范围与连接上下文。

相关内容:行级安全与连接复用。

参考回答

执行角色绕过策略或租户上下文残留,都会破坏隔离。

PostgreSQL 18 的超级用户和 BYPASSRLS 角色绕过 RLS。表所有者默认也绕过。应用需使用受约束角色,并在事务内设置租户范围。连接归还后还要验证上下文已清理。

12. 参考资料​