zoukankan      html  css  js  c++  java
  • 何谓多租户模式 ?

    一、什么是多租户模式

    多租户模式的定义:单个产品实例为多个用户提供服务,同时用户可按需购买使用产品资源,用户数据相互隔离。

    定义里的用户即租户,租户狭义上理解就是使用系统的人。广义上来说还应该包括创建的系统、数据等一切与当前租户有关的系统资源。

    二、举个栗子

    2.1 传统模式

    假设我们有一个学生管理系统,有课程查询、成绩查询两个功能,每个学生都有账号可以登陆,使用系统中的这两个功能。然后我们把这个系统卖给很多个学校去使用,这时候需要给每个学校去部署一套系统。

    2.2 多租户模式

    还是上面的系统,结合第一章节的定义,我们看多租户模式下的系统架构,这时候我们只有一个学生管理系统实例,每个学校使用的时候首先以学校为单位进行租户创建,然后可以按需购买系统功能,比如只需要成绩查询,这里的每个学校就是一个租户。

    三、几种数据隔离模式

    3.1 共享数据表,租户ID隔离

    这种模式也是我们平日里系统隔离用户使用的模式,既在表中加一个用户ID字段,多租户这里就是在表中多加一个租户ID字段进行数据区分,登陆哪个租户就通过ID查询到对应租户的数据。拿成绩表的查询SQL举例就是:

    select * from t_score where tenantid = '租户的ID' 

    3.2 共享数据库,Schema隔离

    该模式就是共享一个数据库实例,然后根据租户建立多个Schema,以Mysql数据库为例,就是建立多个Mysql用户,每个Mysql用户下都有完整的系统表。这里在系统开发时就需要根据租户动态进行数据源切换,获取对应租户的Schema。

    3.3 独立数据库

    该模式就是完全独立数据库实例,还以Mysql数据库为例,就是装有很多个Mysql服务,每个租户对应一个实例 ,每个实例下具有相同的Schema和表 。这里也需要在系统开发时根据租户动态进行数据源切换,获取对应租户的数据库实例。

    四、实现多租户系统的几个关键点

    将一个传统模式的系统,改成多租户架构,大的方面来说,只需要做好这两点即可实现,也是最关键的两点。

    4.1 租户管理

    上面3.1 给了一个SQL,这个SQL在实际开发时,会发现是不可用的,满足不了需求,为什么呢?回到上面的学生管理系统,想想看,学校管理员购买了一个租户系统,而具体使用系统的人是学生,是学生在查成绩,先想一个问题,学生的数据从哪来?

    (1)学校管理员添加

    也就是学校管理员创建了租户系统后,在后台通过学生添加功能进行学生信息录入,这不就有了学生信息了,也容易关联上租户ID,看着好像没有问题,我们来捋一下执行过程。

    学生访问系统 -> 输入账号密码,点登陆后 -> 3.1 模式因为数据源是一个,所以直接连上查t_student表 -> 对比用户名、密码 - > 找到且密码正确即认为登陆成功。

    例外情况1:假如学生张三由学校A转到了学校B,这时候学校A的租户和学校B的租户都有了张三的信息,这时候有两条数据,怎么比对?这时候就不对了,租户ID还无法确定。这时候就需要下面的两种方案。

    例外情况2:假如使用的是3.2 或 3.3 的数据隔离模式,相当于有多个数据源,这时候登陆时连接哪一个数据源查?这时候也就不对了。租户ID还无法确定。这时候同样需要下面的两种方案。

    (2)学生注册为租户

    方式一:学校想添加学生A,可以输入学生A的邮箱地址,发送邀请,学生A收到邮件邀请,登陆平台注册为租户(不创建系统),注册后自动进入发送邀请学校的学生库。

    方式二:学生A直接登陆平台注册为租户,学生A将注册信息提供给学校管理员,学校管理员添加到学生库。

    存储租户的租户表本身是共享的。然后需要 「租户学生表」 (创建系统的租户ID,学生租户ID)

    这时候登陆并查询成绩流程就是:学生输入用户名、密码 -> 查询租户表 -> 登陆成功 -> 查询租户学生表 -> 选择对应的租户学校 -> 进入租户系统首页 -> 查询成绩

    (3)特定登陆地址

    即给每个租户购买系统后,生成特定独有的登陆地址,带有学校的租户ID,然后将登陆地址共享给学生即可。这也可以解决租户ID无法确定的问题。而且无需学生注册为租户。

    4.2 数据路由

    数据路由是数据隔离后的关键点,3.1 模式下即实现SQL的包装,做一层AOP,查询的时候在原来的SQL上附加

     where tenantid = '' and studentid = '' 

    3.2、3.3 则需要根据租户ID动态切换数据源,代码层面即获取不同的Connection,实现细节限于篇幅,此处不展开了。 

    五、总结

    其实如果抛开商业模式来说,淘宝、京东包括我们常见的系统从技术架构上看都可以算是一种多租户系统,为什么?

    因为首先是单实例可以支持多用户的,其次数据是可以根据用户ID隔离的(同第三章节「共享数据表,租户ID隔离」 模式)。

    从整体架构上看又不是,为什么?首先不满足的是系统功能不是按需付费,像淘宝每个会员进去功能都是一样的,不能按需挑选功能,你说我不要订单功能,可能吗?显然不可能,你要不要订单功能就在那。另外功能免费。

    还有就是商业模式的问题,不是将软件本身作为服务销售,还拿淘宝来说,它售卖的是淘宝上的商品,而不是淘宝软件本身的功能。所以模式上不是SAAS,严格上就不算多租户系统。

    最后给大家一个公式,完整的多租户模式 = 多租户商业模式 + 多租户技术架构。

    PS  :可关注「风象南讲全栈」公众号,有机会成为作者微信私人好友

  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/yuboon/p/10404473.html
Copyright © 2011-2022 走看看