讲讲 SaaS 平台的多租户设计

news2024/11/18 12:24:23

本篇就来讲讲 SaaS 平台的多租户设计。

以“钉钉”为例看实际的多租户场景

在讲设计之前,我们先以“钉钉”为例,来看看一个 SaaS 平台是如何运作的。相信大部分B 端产品经理都体验过钉钉,我们分两个维度来讲钉钉的租户注册到使用的流程。一个是从个人视角来看使用钉钉的流程,下面图就是个人使用钉钉的流程。这个流程省略了个人注册和其他人加好友聊天的功能,那个其实不算 B 端的业务范畴了。

img

这里的关键是你要使用某个企业(或团队,以下我们统一称为租户)下的功能,首先你需要被邀请加入某个租户。而且,一个账号可以被邀请加入多个租户。如果你属于多个租户,那么和某个租户相关的操作你需要先切换到该租户下才可以使用。比如我们的工作台、云盘这些就和租户有关,下面的图就是钉钉的工作台,默认会有一个租户,可以通过下拉方式切换租户。

img

那么从租户的角度来说,是什么样的呢?流程如下图所示。

img

与个人不同,对于租户来说,多了创建团队、企业认证和邀请成员几个步骤。这属于管理员类的功能,其中企业认证不是必需的,只是经过认证的企业可用的功能和资源多一些。
通过钉钉的例子我们会得到如下的实体关系:

  • 一个平台有很多个租户;
  • 一个平台也有很多用户;
  • 一个用户属于多个租户,一个租户也有很多个用户。

img

这个是基础的关系,务必要明白。所以实际上一般 SaaS 平台会有三个后台:

  • 运营管理后台:即平台运营管理的后台系统,通常用于管理租户,主要是租户的权限、资源的分配管理;这个平台我们作为 SaaS 用户是接触不到的,但是作为 SaaS 产品设计是必不可少的。
  • 租户管理后台:即租户使用的管理后台,主要是用于租户的管理员管理成员和分配租户内部成员的权限、资源。
  • 业务应用:也就是实际租户的各个成员使用的业务系统,比如我们平时使用的钉钉的桌面端、App 其实都算是业务应用。这个业务应用其实是有多个的。比如钉钉自带的 OA 审批、考勤系统、智能填表等等,其实都是一个个业务应用。有些设计为了简化,在后台系统上,会将租户管理后台和业务应用合并为一个后台。

钉钉的团队版是可以免费体验的,因此如果大家有兴趣可以创建团队了解一下租户管理后台的功能。

租户权限和资源管理

对于一个平台,租户是其服务的主要对象,也是最终的买单人,即 SaaS 系统的订阅者。因此,SaaS 的运营管理后台的一个核心职能就是管理平台上的租户的权限和资源管理。权限的管理和 SaaS 平台的订阅模式有比较大的关系,从抽象角度上来说也可以认为是一种资源。我们常见的 SaaS 在权限这块有两种方式:

  • 按销售版本订阅:这种不同的版本会有不同的功能。一般用于平台本身的业务应用是单体应用,即权限是在应用内,按租户订阅的版本不同分配不同的功能。
  • 按应用订阅:这种是平台比较大了,平台会有若干个应用,租户首先选择开通平台中的某些应用。当然,应用内可以再细分出销售版本,钉钉其实就是这种模式。这种模式比较重,但是扩展性会比较好,适用于有心构建开放应用平台的 SaaS 产品。

两种模式的结构对比如下两张图所示,当然,多应用的 SaaS 平台每个应用也可以单独再分出一层销售版本来。

img

img

资源来说会分为两类,一类是平台级资源,一类是应用内资源。平台级资源由平台统一管理,比如钉钉里的钉盘容量,应用的使用期限等。应用内资源即各个应用自身的资源,比如授权使用的账号数(当然平台级有些也会有总的账号数限制)、短信条数等。这种资源管理的原则是谁维护谁管理,也就是平台维护的资源由平台管理,应用维护的资源由应用管理,下面是资源的关系结构图。一般来说,资源会需要租户购买,或者平台会定期发放免费资源(比如钉钉的“短信钉”就是按月有免费的额度可以使用)。

img

菜单管理

既然涉及到不同销售版本,就会有菜单的管理,也就是需要将菜单统一管理,然后再把菜单组合成销售版本,最后根据租户购买的版本进行授权,最终落到客户那边呈现的就是可用的菜单。这里同样会涉及一个问题,就是菜单归平台管还是归应用管。这两种模式其实现实中都有。我们遇到的平台就是平台统一管理,也就是应用首先要在平台配置菜单,这样租户才可以使用。个人来说,不推荐这种由平台统一管理的方式。一方面是导致平台和应用强耦合,如果平台有第三方应用的话,意味着第三方需要和平台要同步菜单;另一方面是限制了平台的灵活性,因为既然是菜单,要统一管理就需要有一套标准的菜单管理模式,这就要求应用必须按照平台的规则来。还有一个是,平台要给应用开发者(或运营者)开放账号管理菜单,实际上也增加了复杂度。

实际上,应用开发方也会有对应的运营团队,平台只需要给租户和应用开发方提供沟通的渠道就可以了。比如,租户订阅某个应用成功后,通知应用开发方及时维护租户的权限即可。因为,实际 B 端企业订阅某个应用,会有个下单付款过程,一般付款都是采用汇款的方式(我们在钉钉上购买第三方应用的时候也是单独付款给第三方,而不是经过支付宝这类通道),这就意味着付款成功后才会介入服务。当然,也有免费提供试用期的,这个时候只要租户订阅应用,应用开发方的售后团队就可以提前介入提供服务,实际上后续付费后也能接得上。

有了菜单管理后,SaaS 的实体关系变成了下面的样子,这里省略了资源,实际资源和销售版本有点类似,只是会有平台级和应用内资源。总结来说,各个实体的关系如下:

  • 一个平台会有多个应用;
  • 一个应用会有多个菜单,通过菜单组合成多种销售版本;
  • 租户属于1个平台,租户可以根据自身需要订阅多个平台下的应用的某个销售版本。
  • 租户拥有多个用户,用户也可以属于多个租户,但用户则属于同一个平台。

img

多租户设计的核心要点

有了上面的整体概念后,我们就知道 SaaS 的多租户设计的核心要点了,整理如下图所示。这里说明几点:

  • 用户和账号的区别:对于平台来说,注册的账号实际是平台用户,要通过用户来确定用户的唯一性。同时,为了用户能够切换租户,需要有用户租户管理(即用户属于哪些租户);对于租户来说,用户其实就是账号,也就是我这个租户下开通了哪些账号,一般一个账号就对应一个员工。需要注意的是,租户下的账号可以注销的(或者是禁用),比如说员工离职了,他还可以使用平台,但是无法使用该租户下的功能。
  • 订单管理:平台、应用和租户都能够看到订单,只是范围不同。平台管理整个平台的订单(不包含应用内自己的资源订单,除非平台覆盖到了应用内的交易环节),应用内管理应用自身产生的的订单,而租户看到的是自己的订单。
  • 租户权限管理:平台如果是纯粹的平台,那么其实可以没有权限管理的,但是一般 SaaS 平台不会是一个空架子,会有一个或多个核心抓手应用。这个就看平台的设计了,是一开始就把自己的应用当做第三方等同对待还是特殊处理。应用管理租户的权限主要是销售版本的管理,这个很多时候可以通过订单自动同步管理。不过,要考虑特殊场景,比如租户可能购买的是较低级版本,但是为了推广高级版本,可能会在后台给租户开通高级版本的试用权限。
  • 租户后台:租户后台其实和业务应用可以混合在一起,只是管理员的权限不同而已。租户后台主要就是邀请成员(开账号),进行授权管理(通常会有功能权限和数据权限),然后是自己在平台消费的资源和订单管理,主要是购买和查看为主。
  • 业务应用:一般是基层员工用的频次更多,对于管理层更多提供的是报表类的功能。这里主要是能够支持用户切换租户以及便于租户下的成员使用租户开通的业务应用功能。

img

多租户的数据存储设计

在技术上多租户数据存储有很三种方式,一个是共用数据表,也就是不同租户的数据存储在同一张数据表中,然后通过租户 id 区分。这种适合小型的 SaaS应用,优点是开发实现简单,缺点是不同租户之间的操作数据会有一定的影响(因为操作的同一个数据表,如果多个租户同时操作,会有并发性能问题)。

另一个是分表设计,即不同的租户的数据表结构虽然相同,但是使用各自的数据表。比如说一个权限表名是 auth,那么 A 租户的叫 a_auth,B 租户的叫 b_auth。这种设计需要根据租户动态创建表,一般表名会有租户 id 来区分唯一性。隔离程度上,比共用表好很多,复杂性也高一些,同时由于是共用了数据库,整体性能会受数据库性能影响,也就是租户之间的操作还是一定程度上会相互影响。

最后一种是分库设计,就是不同的租户使用不同的数据库,这样在数据上是完全隔离的。当然,技术实现上也最复杂了。对于业务系统比较重的垂直SaaS应用,建议是按这种方式设计。因为,深入客户业务的 SaaS 系统一般都是高频操作,随着客户量增加,如果不分离数据,会导致性能瓶颈出现。

当然,实际也可以采用渐进式的数据存储设计,即客户少的时候使用共用数据表,客户稍微多的时候用分表设计,最后再使用分库设计。这种前期成本低,后期会有数据迁移成本。

总结

本篇梳理了一下 SaaS 系统的多租户设计的结构,各类设计的特点,相信对 SaaS 产品经理会有不小的帮助。对于 SaaS 系统的设计,如果要调研复杂的 SaaS 系统,推荐大家可以体验阿里云后台和钉钉,相比而言,云厂商的后台虽然不太像 SaaS,但是基本的设计思想是一样的,而且云厂商的设计更为复杂一些,涵盖了多个业务子系统和多类资源分配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql数据库(下)

目录 约束 约束的概念和分类 1、约束的概念: 2、约束的分类 1、主键约束 2、默认约束 3、非空约束 4、唯一约束 5、外键约束 约束 约束的概念和分类 1、约束的概念: 约束时作用于表中列上的规则,用于限制加入表的数据约束的存在保证…

代码随想录算法训练营第day40|343. 整数拆分 、 96.不同的二叉搜索树

a.343. 整数拆分 题目链接 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: …

csgo搬砖核心步骤,月入1000-10000你也可以的!

近年网络游戏产业的爆炸式增长,虚拟物品的交易需求也越来越大,为了满足虚拟物品的交易需求,网络游戏交易平台开始兴起和发展。网游交易平台的交易项目包括帐号交易、游戏币交易、装备交易这几种主要交易项目,其交易模式可分为C2C模…

FPGA IBUFG

IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO和其它内部CLB等没有物理连接。 所以,IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…

大数据技术学习笔记(五)—— MapReduce(1)

目录 1 MapReduce 概述1.1 MapReduce 定义1.2 MapReduce 优缺点1.3 MapReduce 核心思想1.4 MapReduce 进程1.5 Hadoop 序列化类型1.6 MapReduce 编程规范1.7 WordCount 案例实操1.7.1 案例需求1.7.2 环境准备1.7.3 编写程序1.7.4 测试 2 MapReduce 序列化2.1 序列化概述2.2 自定…

2023最新群智能优化算法:巨型犰狳优化算法(Giant Armadillo Optimization,GAO)求解23个基准函数(提供MATLAB代码)

一、巨型犰狳优化算法 巨型犰狳优化算法(Giant Armadillo Optimization,GAO)由Omar Alsayyed等人于2023年提出,该算法模仿了巨型犰狳在野外的自然行为。GAO设计的基本灵感来自巨型犰狳向猎物位置移动和挖掘白蚁丘的狩猎策略。GAO…

2.4_1 死锁的概念

文章目录 2.4_1 死锁的概念(一)什么是死锁(二)死锁、饥饿、死循环的区别(三)死锁产生的必要条件(四)什么时候会发生死锁(五)死锁的处理策略 总结 2.4_1 死锁的…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ ;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法:向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时,会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型,它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

并发安全问题(超卖问题)

一,问题解析 超买问题就是,原本库存中有200件库存,结果由于并发问题售出了300件这就是炒卖问题对于买东西无非就是 查询商品,判断库存是否充足,如果充足则下单成功。 这里采用的是先查询,再判断&#xff0c…

谷歌广告(google Ads)投放技巧

Google广告投放涉及多个方面,以下是一些常用的技巧,可以帮助提高广告效果: 关键词选择: 选择与你的产品或服务紧密相关的关键词,并确保这些关键词与用户的搜索意图匹配。使用Google关键词规划工具来找到潜在的关键词&a…

C++泛型实现搜索二叉树

文章目录 二叉搜索树查找插入删除实现应用性能分析 二叉搜索树 二叉搜索树(BST,Binary Search Tree)又称为二叉排序树,空树也算 二叉搜索树有如下性质 若左子树不为空,则左子树上所有节点值小于根节点若右子树不为空…

USB2.0设备检测过程信号分析

1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互,下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同,而主机或者Hub接收端连接…

NTFS安全权限

NTFS是新技术文件系统(New Technology File System)的缩写,是一种用于Windows操作系统的文件系统。NTFS提供了高级的功能和性能,包括文件和目录的权限控制、加密、压缩以及日志等。它被广泛应用于Windows NT、Windows 2000、Windo…

基于SSM的大王门店管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SSM 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 MyBatis 4 1.2 Shiro 4 1.3 前端技术 4 1.3.1 Bootstrap 4 1.3.2 jQuery 4 1.3.3 Ajax 5 1.3.4 Layui 5 1.3.5 Thymeleaf 5 1.4 本章小结 6 2 系统分析 7 2.1 功能需求分析…

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的: 熟悉yum和编译安装操作 锻炼关联性思维,便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…

数据库 04-01 数据库的设计

01.设计的第一步,记录用户的信息 02.第二步概念转换成数据库概念 概念设计是什么: 着重点: 03.第三步完成增删改查的功能设计 04.最后的在数据库上实现

[HackMyVM]靶场 Zeug

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…

Vue事件处理:.passive修饰符与应用场景

.passive修饰符 passive这个修饰符会执行默认方法。你们可能会问,明明默认执行为什么会设置这样一个修饰符。这就要说一下这个修饰符的本意了。 浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时,才能知道内部是否会调用preventDefa…

数据结构——lesson7二叉树 堆的介绍与实现

前言💞💞 啦啦啦~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于数据结构顺序表链表有疑问的都可以在上面数据结…