单个产品实例(SaaS)为多个用户提供服务,用户可按需购买使用产品资源,用户数据相互隔离。
1、简介
定义
- 多租户模式:单个产品实例(SaaS)为多个用户提供服务,用户可按需购买使用产品资源,用户数据相互隔离。
- 租户:
- 狭义:系统的使用者,即用户。
- 广义:除了用户,还包括创建的系统、数据等所有与租户有关的资源。
示例:学生管理系统,具备 ABCD 系统功能。
- 传统模式:
- 厂商将系统卖给学校。
- 每个学校部署一套系统,拥有系统的完整资源。
- 存在多个服务实例,每个实例具有完整功能 ABCD。
- 多租户模式:
- 厂商提供 SaaS 化产品。
- 学校按需购买系统功能,厂商以学校为单位创建租户并分配资源。
- 存在唯一的服务实例(厂商),每个租户具有特定资源。
2、数据隔离方式
数据库分级:从上往下的包含关系
- MySQL 服务
- 数据库
- Schema
- 表
- 字段
常见隔离方式
租户 ID | Schema | 数据库 | |
共享形式 | 表 | 数据库 | MySQL 服务 |
区分方式 | 租户 ID 字段 | 每个租户对应一个 Schema | 每个租户对应一个数据库实例 |
前置操作 | 定义租户 ID 或租户关联表 | 为每个租户建立 Schema(具有相同的表) | 为每个租户建立数据库(具有相同的 Schema 和表) |
操作 | 根据租户 ID 筛选数据 | 根据租户动态切换数据源,访问相应 Schema | 根据租户动态切换数据源,访问相应数据库实例 |
3、技术要点
3.1、租户管理
以学生管理系统的成绩查询为例,真正的用户是学生,如何查询成绩?
- 学校即租户:每个学校对应一个租户(共享表,通过租户 ID 隔离)。
- 实现:学生表 t_stu 保存学生账号密码。
- 执行流程:学生登录系统 → 查 t_student 表校验账号密码 → 登录成功 → 查询成绩。
- 失败情况:
- 学生转学:两个学校存在相同数据,且登陆时无法指定租户 ID。
- 隔离方式:假如是 Schema 隔离或数据库隔离,无法确定数据源。
- 学生租户:将学生注册为租户(不创建系统),且与学校租户关联。
- 实现:租户学生表 t_tenant_stu 保存学生账号密码,关联学生租户 ID 与学校租户 ID。
- 执行流程:学生登录系统 → 查租户表校验账号密码 → 登录成功 → 查 t_tenant_stu 表确定学校 → 查询成绩。
- 特定登录地址:每个学校对应一个租户,且系统登录地址唯一(与租户 ID 绑定)。
3.2、数据路由
根据隔离方式,采用不同的数据路由方式
- 租户 ID:在 SQL 查询条件追加
WHERE tenant_id = ? AND stu_id = ?
- Schema 或数据库:Spring AOP 根据租户 ID,动态切换数据源。
4、总结
多租户模式 = 多租户技术架构 + 多租户商业模式
- 技术架构:
- 根据用户进行数据隔离,如租户 ID、Schema、数据库级别。
- SaaS 化,支持按需付费。
- 商业模式:将软件系统本身作为服务销售,而不是售卖其它商品。
示例
- 多租户:阿里云、腾讯云、华为云等平台。支持按需购买平台资源。
- 非多租户:淘宝。所有用户的功能相同且免费,实际交易的是商品而非系统本身。