单个产品实例(SaaS)为多个用户提供服务,用户可按需购买使用产品资源,用户数据相互隔离。

1、简介

定义

  • 多租户模式:单个产品实例(SaaS)为多个用户提供服务,用户可按需购买使用产品资源,用户数据相互隔离。
  • 租户
  • 狭义:系统的使用者,即用户。
  • 广义:除了用户,还包括创建的系统、数据等所有与租户有关的资源。

示例:学生管理系统,具备 ABCD 系统功能。

  • 传统模式
  • 厂商将系统卖给学校。
  • 每个学校部署一套系统,拥有系统的完整资源。
  • 存在多个服务实例,每个实例具有完整功能 ABCD。
  • 多租户模式
  • 厂商提供 SaaS 化产品。
  • 学校按需购买系统功能,厂商以学校为单位创建租户并分配资源。
  • 存在唯一的服务实例(厂商),每个租户具有特定资源。

2、数据隔离方式

数据库分级:从上往下的包含关系

  • MySQL 服务
  • 数据库
  • Schema
  • 字段

常见隔离方式

租户 ID

Schema

数据库

共享形式


数据库

MySQL 服务

区分方式

租户 ID 字段

每个租户对应一个 Schema

每个租户对应一个数据库实例

前置操作

定义租户 ID 或租户关联表

为每个租户建立 Schema(具有相同的表)

为每个租户建立数据库(具有相同的 Schema 和表)

操作

根据租户 ID 筛选数据

根据租户动态切换数据源,访问相应 Schema

根据租户动态切换数据源,访问相应数据库实例

3、技术要点

3.1、租户管理

以学生管理系统的成绩查询为例,真正的用户是学生,如何查询成绩?

  • 学校即租户:每个学校对应一个租户(共享表,通过租户 ID 隔离)。
  1. 实现:学生表 t_stu 保存学生账号密码。
  2. 执行流程:学生登录系统 → 查 t_student 表校验账号密码 → 登录成功 → 查询成绩。
  3. 失败情况
  1. 学生转学:两个学校存在相同数据,且登陆时无法指定租户 ID。
  2. 隔离方式:假如是 Schema 隔离或数据库隔离,无法确定数据源。
  • 学生租户:将学生注册为租户(不创建系统),且与学校租户关联。
  1. 实现:租户学生表 t_tenant_stu 保存学生账号密码,关联学生租户 ID 与学校租户 ID。
  2. 执行流程:学生登录系统 → 查租户表校验账号密码 → 登录成功 → 查 t_tenant_stu 表确定学校 → 查询成绩。
  • 特定登录地址:每个学校对应一个租户,且系统登录地址唯一(与租户 ID 绑定)。

3.2、数据路由

根据隔离方式,采用不同的数据路由方式

  1. 租户 ID:在 SQL 查询条件追加 WHERE tenant_id = ? AND stu_id = ?
  2. Schema 或数据库Spring AOP 根据租户 ID,动态切换数据源。

4、总结

多租户模式 = 多租户技术架构 + 多租户商业模式

  1. 技术架构
  • 根据用户进行数据隔离,如租户 ID、Schema、数据库级别。
  • SaaS 化,支持按需付费。
  1. 商业模式:将软件系统本身作为服务销售,而不是售卖其它商品。

示例

  • 多租户:阿里云、腾讯云、华为云等平台。支持按需购买平台资源。
  • 非多租户:淘宝。所有用户的功能相同且免费,实际交易的是商品而非系统本身。