Skip to content

多租户隔离面试题:数据权限、资源配额、缓存、MQ与数据库隔离

本页只放面试标准回答和原理跳转。完整原理、流程图、Demo 和 Runbook 见多租户隔离主线

高频问题

面试题标准回答原理知识点
多租户隔离怎么做多租户隔离不是只加tenant_id字段,而是身份、数据、资源、缓存、消息、数据库和审计全链路治理。Gateway确认可信租户身份,服务层校验数据权限,SQL强制带租户条件,缓存Key、MQ消息、ES文档和审计日志都要带租户维度,资源池要按租户限流和隔离。多租户不是一个字段
租户身份从哪里来租户身份必须来自可信认证链路,例如JWT Claim、权限中心、子域名和登录态绑定,不能直接信任客户端传入的X-Tenant-Id。Gateway要删除外部伪造Header并重写可信租户上下文,下游服务仍要校验来源和权限。租户身份来源
Gateway鉴权后服务层为什么还要校验Gateway只能做入口认证和粗授权,不能判断所有资源归属。用户有接口权限不代表能看所有租户、医院、科室的数据。服务层要根据事实源判断数据权限,SQL也要强制带租户条件。数据权限和SQL隔离
ThreadLocal保存租户有什么坑线程池会复用线程,如果请求结束不在finally里清理ThreadLocal,下一个请求可能继承上一个租户,造成串数据。异步线程、CompletableFuture、MQ消费者也不会自动继承上下文,必须显式传递和清理。租户上下文透传
热租户拖垮全站怎么办先按租户看QPS、P99、错误率、线程池、连接池、MQ分区和Redis热Key;临时降低该租户入口限流和高成本接口并发,暂停或限速批处理;长期按租户做配额、Bulkhead、独立队列、大租户独立库或独立集群。资源隔离热租户Runbook
Redis Key怎样避免租户串数据Key必须包含租户边界,例如asset:{tenantId}:{assetId}user:permissions:{tenantId}:{userId}。本地缓存、布隆过滤器、限流Key也要带租户维度。不要把一个租户所有数据塞进一个大Key。缓存Key隔离
MQ怎样做租户隔离消息必须带tenantId,消费者写库时再次校验tenant_id。多数场景共享Topic并按tenantId或业务Key分区,大租户可独立Topic或队列。不要为无限租户动态创建无限Topic/Binding,否则Broker资源和指标基数会爆炸。MQ隔离
数据库租户隔离模型怎么选共享库共享表成本低但隔离弱;共享库独立Schema隔离更强但管理复杂;独立库适合大客户或合规要求高;独立集群隔离最强但成本最高。常见做法是普通租户共享表,头部大租户独立库或集群。数据库隔离模型
怀疑租户串数据怎么排查拿traceId、userId、tenantId、资源ID,依次查Gateway是否清洗Header、Feign/RPC是否白名单透传、Service是否校验资源归属、SQL是否缺tenant_id、Redis Key是否缺租户、ES DSL是否带tenant filter、审计日志影响范围。串数据Runbook

场景题

1. 医疗平台里用户能看到别的医院资产,怎么排查

标准回答:

我会先用traceId定位这次请求的用户、租户、医院和资源ID,再查Gateway是否基于Token确定租户并清洗外部Header;然后看服务层是否校验用户是否有该医院权限;再查SQL是否缺少tenant_id或hospital_id条件,Redis Key是否只按assetId缓存,ES查询DSL是否带tenant和hospital过滤。最后通过审计日志确认影响范围,修复后增加强制租户条件、缓存Key规范和自动化权限测试。

原理入口:租户串数据Runbook

2. 一个大租户批量导出导致全站慢,怎么治理

标准回答:

这是典型热租户拖垮共享资源。短期先按租户降低导出接口限流和并发,暂停该租户批处理或迁移到独立队列,保护其他租户核心链路。排查看该租户是否占满Tomcat线程、业务线程池、DB连接池、慢SQL、Redis热Key或MQ分区。长期做租户级配额、高成本接口单独限流、批处理错峰、大租户独立库或读库。

原理入口:热租户治理

面试回答模板

text
多租户隔离要从身份、数据、资源、缓存、消息、数据库和审计全链路设计。入口Gateway校验Token,删除外部伪造租户Header并写入可信上下文;服务层继续校验用户是否属于该租户以及资源归属;SQL必须强制带tenant_id,索引也要贴合tenant_id、业务条件和排序。资源上按租户做入口限流、接口配额、并发隔离、线程池和连接池预算,避免热租户拖垮全站。Redis Key、MQ消息、ES文档、审计日志都必须带租户维度。大租户可以独立队列、独立库或独立集群。

本章小结

多租户面试不能只说“表里加tenant_id”。要讲清可信身份、Header清洗、上下文透传、Service数据权限、SQL兜底、缓存Key、MQ分区、资源配额、大租户隔离和串数据排查。