当前位置: 首页 > news >正文

【实战】SAAS多租户详细设计

SAAS多租户详细设计文档

请关注公众号【碳硅化合物AI】

摘要

本文档阐述SAAS多租户架构设计,解决一套系统服务多个客户时的成本、数据隔离、配置个性化、扩展性和运维复杂度问题。采用逻辑租户隔离方案,通过tenant_id字段实现数据隔离,结合RBAC权限体系、元数据驱动和OAuth2+JWT认证,确保租户数据安全隔离并支持个性化配置。相比按库隔离,该方案在成本、运维效率和扩展性之间取得平衡,适合租户数量多、数据量中等的场景。

一、SAAS化多租户解决什么问题

SAAS多租户要解决的核心问题是:一套系统服务多个客户,每个客户的数据和配置要完全隔离,互不干扰

具体来说,主要解决这几个问题:

1. 成本问题

传统方式每个客户一套系统,服务器、数据库、运维成本都是 N 倍。多租户模式下,一套系统服务所有客户,成本大幅降低。比如原来 100 个客户需要 100 套系统,现在一套系统就够了。

2. 数据隔离问题

多个客户用同一套系统,最怕的就是数据串了。A 客户能看到 B 客户的数据,这是灾难性的。多租户必须保证数据完全隔离,A 客户只能看到自己的数据。

3. 配置个性化问题

不同客户对功能、界面、流程的需求不一样。有的客户需要自定义菜单名称,有的需要调整按钮顺序,有的需要禁用某些功能。多租户要支持这种个性化配置。

4. 扩展性问题

客户数量会增长,系统要能平滑扩展。不能因为客户多了就卡顿,也不能因为某个客户数据量大就影响其他客户。

5. 运维复杂度问题

传统方式每个客户一套系统,升级、打补丁、监控都要做 N 遍。多租户模式下,一次升级所有客户都受益,运维效率大幅提升。

二、如何实现,关键点有哪些

1. 数据隔离机制

所有业务表都加tenant_id字段,这是数据隔离的基础。查询时自动带上tenant_id条件,写入时自动设置tenant_id,确保数据不会串。

2. 租户上下文管理

系统要能识别当前请求是哪个租户的。通过中间件从 JWT Token 或请求头中提取tenant_id,放到线程上下文里,后续所有操作都基于这个上下文。

3. 权限体系(RBAC)

用户-角色-权限三层模型。用户关联角色,角色关联权限,权限关联资源(菜单/按钮/API)。这样权限管理灵活,可以按角色批量授权。

4. 元数据驱动

资源(菜单、按钮、API)基于元数据定义。元数据是模板,租户资源是实例。这样既能统一管理,又能支持个性化配置。

5. 认证与授权

采用 OAuth2 + JWT 方案。全局认证用户(auth_user)作为认证主体,租户用户(tenant_user)通过auth_user_id关联,实现一人多租。JWT Token 里包含tenant_id和权限信息,资源服务验证 Token 后直接使用,无需再查数据库。

6. 架构分层

采用 DDD 四层架构:接口层(Controller)、应用层(Service)、领域层(Domain)、基础设施层(Repository)。职责清晰,易于维护。

三、数据存储方式

多租户的数据存储主要有两种方式:按库隔离逻辑租户隔离。我们采用逻辑租户隔离。

按库隔离(Database per Tenant)

每个租户一个数据库,完全物理隔离。

优点

  • 数据完全隔离,安全性最高
  • 可以按租户独立备份、恢复
  • 某个租户数据量大不影响其他租户
  • 可以按租户独立扩展(分库)

缺点

  • 数据库数量多,运维复杂
  • 升级、打补丁要操作 N 个库
  • 跨租户统计、分析困难
  • 成本高(连接池、资源占用)

适用场景:租户数量少(< 100),数据量大,对隔离要求极高。

逻辑租户隔离(Shared Database, Shared Schema)

所有租户共用一个数据库,通过tenant_id字段区分。

优点

  • 运维简单,一次升级所有租户受益
  • 成本低,资源利用率高
  • 跨租户统计、分析方便
  • 扩展性好,可以水平分片

缺点

  • 需要严格保证tenant_id过滤,否则会数据泄露
  • 某个租户数据量大可能影响其他租户(需要分片)
  • 备份恢复需要按租户过滤

适用场景:租户数量多(> 100),数据量中等,对成本敏感。

我们的选择:逻辑租户隔离

我们采用逻辑租户隔离,原因如下:

  1. 租户数量多:预期会有大量租户,按库隔离不现实
  2. 成本考虑:一套数据库服务所有租户,成本可控
  3. 运维效率:一次升级、一次监控,效率高
  4. 技术保障:通过中间件、拦截器、切面等技术手段,严格保证tenant_id过滤

数据隔离实现

关键实现点

  1. 查询拦截器:MyBatis 拦截器拦截所有 SQL,自动添加WHERE tenant_id = ?条件
  2. 写入切面:AOP 切面拦截所有写入操作,自动设置tenant_id字段
  3. 上下文管理:ThreadLocal 存储当前租户 ID,请求结束时清理
  4. 权限校验:接口层校验,确保不能跨租户访问

混合方案(可选)

如果未来某个租户数据量特别大,可以采用混合方案:

  • 小租户:逻辑隔离(共享库)
  • 大租户:按库隔离(独立库)

通过配置表记录每个租户的存储方式,动态路由到对应的数据源。

总结

SAAS多租户的核心是数据隔离配置个性化。我们通过tenant_id字段实现逻辑隔离,通过元数据驱动支持个性化配置,通过 RBAC 体系管理权限,通过 OAuth2 + JWT 实现认证授权。

这种方案在成本、运维、扩展性之间取得了平衡,适合租户数量多、数据量中等的场景。关键是要严格保证tenant_id的过滤和设置,不能有遗漏,否则就是严重的安全问题。

http://www.jsqmd.com/news/162004/

相关文章:

  • Java计算机毕设之基于协同过滤算法的音乐推荐系统springboot基于协同过滤算法的音乐推荐系统(完整前后端代码+说明文档+LW,调试定制等)
  • Ansible - Role介绍 和 使用playbook部署wordPress
  • 【教学类-89-02】20251229新年篇11—— 马年红包(Python图片)
  • PyTorch模型保存与加载最佳实践:避免常见陷阱
  • CUDA核心数查询命令:nvidia-smi结合PyTorch使用
  • PyTorch Autograd机制详解:反向传播原理与实现
  • python基于Android和java的酒店管理系统设计 小程序_54ybz
  • GitHub Wiki搭建PyTorch项目文档:知识沉淀好帮手
  • Java计算机毕设之基于web的中医诊所预约挂号系统设计与实现基于SpringBoot+vue的中医诊所预约挂号系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Git LFS存储大模型权重:PyTorch项目版本控制新方式
  • PyTorch与TensorFlow对比:为何更多人转向PyTorch生态
  • PyTorch安装指定版本:如何选择合适的CUDA匹配
  • 萤石开放平台 Ehome协议设备接入 |海康设备Ehome协议接入指南
  • Anaconda配置PyTorch环境太麻烦?用这个CUDA镜像秒解决
  • python基于Android平台的古诗词学习挑战系统 小程序_b7obw
  • 单片机基础知识---程序跑飞
  • 2025-12-29
  • 【课程设计/毕业设计】基于协同过滤算法的个性化音乐推荐系统基于协同过滤算法的音乐推荐系统【附源码、数据库、万字文档】
  • Git克隆超时?解决PyTorch开源项目下载失败问题
  • 大数据领域Doris与传统数据库的性能对比分析
  • PyTorch-CUDA-v2.8镜像支持哪些显卡?NVIDIA全系列兼容列表
  • 【课程设计/毕业设计】基于web的中医诊所预约挂号系统设计与实现约挂号、病历管理、药品库存、医生信息展示【附源码、数据库、万字文档】
  • PyTorch-CUDA镜像更新日志:v2.8带来哪些性能升级
  • 如何在NVIDIA显卡上运行PyTorch?使用CUDA-v2.8镜像轻松实现
  • python基于Android的个人理财家庭财务收支系统422vl 小程序
  • 零基础入门深度学习:使用PyTorch-CUDA-v2.8镜像快速上手
  • 产品说很简单,我写了1天:时间段组件的踩坑之路
  • 在HTTP协议中Keep Alive是什么意思
  • Jupyter Notebook单元格执行时间测量:PyTorch性能分析
  • PyTorch DataLoader打乱顺序shuffle原理剖析