SaaS 系统架构成熟度模型的 5 个级别——从“混乱”到“乌托邦“

  • 第 0 级(混乱):每次新增一个客户,都会新增软件的一个实例。
  • 第 1 级(受控的混乱):所有客户都运行在软件的同一个版本上,而且任何的定制化都通过修改配置来实现。
  • 第 2 级(多租户 [multi-tenant]、高层建筑 [Highrise]):所有的客户都已经可以在软件的同一个版本上运行了,而且他们都在同一个“实例”上运行。
  • 第 3 级(多租户, 扩建 [Build-Out]):此时你已经拥有了多租户、单一版本的软件模型。不过你还是可以通过硬件扩展(scale-out)的方式来进行扩充。
  • 第 4 级(乌托邦):如同第 3 级,除非你可以找出有效的方式,以在不同的“实例”上运行不同版本的软件。

应用程序必须支持多租户:

多租户可以分为几个不同的类别:

  • 云中的简单虚拟化,其中只对硬件进行共享。
  • 共享应用程序,对每个租户使用不同的数据库。
  • 共享应用程序和数据库(效率最高,真正的多租户)。

我们要实现的也即效率最高的,真正的多租户业务模型。但选择是有个筛选的过程的,下面分别介绍下各种多租户的数据隔离方案。

独立应用独立库

多个不同的应用,每个应用都有自己的数据库。这种方式虽然保证了租户数据的隔离,但无论是在扩展性和成本上都是最差的,故首先淘汰这种方式。

同一个应用程序,每个租户一个库

优点是

  • 租户数据在数据库维护物理上隔离了,
  • 由于是每个租户一个库可以在库表设计上做单独扩展,但这也引起了应用程序的兼容问题

缺点是数据库维护成本和高,(举例:在相同数据结构的情况下,增加表中的列或索引,需要操作多个库)开发成本也高。

同一个应用程序,同一个数据库

缺点:多租户数据库必然会牺牲租户隔离。多个租户的数据一起存储在一个数据库中。在开发过程中,确保查询不会暴露来自多个租户的数据。

优点:是所有方案中成本最低的。

分片多租户

分片多租户即:多租户的单应用+支持多租户的单数据库(分片)

看起来是不是跟第一个图中:同一个应用程序,每个租户一个库模式差不多,只不过每个库多了几个租户数据?其实是大不相同的。首先,第一种模式中不同租户的库是可以分别扩展的,也就是结构可以不一样,但分片多租户的是同一种数据结构。其次,分片模式的扩展性很强,它可以是一个分片一个租户,也可以是一个分片多个租户,具体要看具体的分片策略。来看下分片模式下具体的指标情况:

指标 分片多租户
可扩展性 无限 1-1000000s
租户隔离性 中等
每一个租户的数据库成本 最低
性能监控和管理 综合和单个(偏综合)
开发复杂度 中等
运维复杂度 从低到高,单租户的管理比较复杂

我们的模型选择

基于以上的分析,我们选择采用分片多租户的模型,因为这样可以获得无限的扩展能力,且对租户数据的隔离性也比较好。这样的话数据库结构就是统一的,不同分片是同一库表结构。而具体分库规则是可以配置的,建议前期按照 一租户一库 的策略配置。

开发实践

  • 每一个表的设计都应该考虑是否要加入 “租户 ID”字段,用来区别不同“租户”,或者不同客户,另外,也方便后面用“租房 ID”作为 分片键

  • 我们将引入 ShardingSphere 帮我们做数据库的分库分表,对于应用来说是相对透明的,减少应用开发在数据库层面由于引入分库分表的复杂度。

  • 我们利用分片规则对数据进行分片,比如根据租户 ID,配置分库分表规则

# 配置分片规则
- !SHARDINGtables:# 配置 t_order 表规则t_order: actualDataNodes: ds${0..1}.t_order${0..1}# 配置分库策略databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: database_inline# 配置分表策略tableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: table_inlinet_order_item: # 省略配置 t_order_item 表规则。..# ...# 配置分片算法shardingAlgorithms:database_inline:type: INLINEprops:algorithm-expression: ds${user_id % 2}table_inline:type: INLINEprops:algorithm-expression: t_order_${order_id % 2}
复制代码
  • 当数据库表结构有变更的时候(DDL),通过 ShardingProxy 进行代理修改,ShardingProxy 会按照分库分表规则进行多库表的自动修改。

元数据/配置驱动

一个好的 SaaS 解决方案应该是高效的多租户。可以使用每个租户的元数据来实现多租户。可以为每个特定组件定义元数据。它定义了运行时的应用程序数据、应用程序的基础功能,以及特定租户的数据和自定义(如果有的话)。

SAAS 架构模式下的多租户系统设计相关推荐

  1. SaaS服务模式下的电商ERP遇到企业仓库分布于多组织下的管理

    问题背景描述 案例发生在近期的一个ERP交付项目,该项目客户方是集团公司,下属多个工厂和销售公司.其电商业务数据归属与旗下的电商公司统筹管理,但线上店铺却归属于多个工厂,也就是电商业务分别在多个分公司 ...

  2. 倒三角组织架构模式下的赋能方式

    以前一名士兵要想呼唤炮火支援,需要向上级层层申请,甚至需要大BOSS亲自下达命令才能调动炮兵,但是现在该命令由一线战斗小组下达,其具备了调动后方资源的能力,后方资源围绕前端进行作战,特种作战正在改变以 ...

  3. 达梦DM8单进程多线程架构模式下各线程详解

    达梦数据库进程管理方式类似于Mysql,属于单进程多线程模式.数据库服务进程包含:DmServer(主服务进程)和DmAPService(备份服务进程).线程主要包括:监听线程.IO线程.工作线程.调 ...

  4. 微服务架构模式下配置管理

    每一个大型分布式微服务系统都应该有一个配置中心 Spring Cloud下配置管理 ---------------------------------------------------------- ...

  5. 新零售SaaS架构:多租户系统架构设计

    什么是多租户? 多租户是SaaS领域的特有产物,在SaaS服务中,租户是指使用SaaS系统的客户,租户不同于用户,例如,B端SaaS产品,用户可能是某个组织下的员工,但整个企业组织是SaaS系统的租户 ...

  6. 基于SaaS软件即服务模式的报表系统

    引言 软件即服务(Software as a Service,SaaS)是随着互联网技术而蓬勃发展的一种新的软件应用模式,其正深刻改变着企业信息系统的开发和运行方式.目前,企业内部大数据的形成使得传统 ...

  7. 以三维地图和倾斜摄影为基础的CIM托底,以三维视频融合或投影融合为核心的时空克隆为引擎,以混合架构模式构建的魔镜平台,将成为元宇宙的主流 点卯+魔镜系列

    一.元宇宙 元宇宙的兴起,让以三维视频融合与三维投影融合为核心.以倾斜摄影和三维地图构筑的CIM作为托底的时空克隆引擎,成为时代的主流技术,以此打造了混合架构的魔镜平台 元宇宙不同于数字孪生的概念,数 ...

  8. Serverless 架构模式及演进

    作者:西流 编辑&排版:雯燕 Serverless 架构 按照 CNCF 对 Serverless 计算的定义,Serverless 架构应该是采用 FaaS(函数即服务)和 BaaS(后端服 ...

  9. Hybris平台Web架构模式演变:前后端分离

    "前后端分离"显然已不是什么新鲜的话题,表面上看是一场架构模式的变革,但实质上是为了解决以往传统的服务端MVC设计模式的一些诟病和痛点.前后端分离带来的全新的前后端协作方式能够让专 ...

最新文章

  1. Task03:青少年软件编程(Scratch)等级考试模拟卷(二级)
  2. 想学Python?快看看这个教程!收藏!
  3. Linux命令之cal
  4. mysql 中文乱码解决方法
  5. 女性买房需要注意哪些问题
  6. mysql+存储器_mysql内存储器计算公式_mysql
  7. SAP License:定义某一模块的后台配置权限
  8. 记录几种常用编码方式:BASE64、MD5
  9. iStack详解(二)——堆叠连接方式堆叠拓扑变动处理
  10. Apple设备的列表中的手机却不能更新iOS 14怎么办
  11. OCS2007视频会议客户端的部署与应用
  12. PAT之算法/技巧:01背包
  13. win10时间自动更新错误
  14. jQuery 梁桐老师笔记 - 选择器
  15. matlab 输出两列,Matlab绘制两列正弦波的叠加
  16. 视频特征提取常用范式总结
  17. javascript根据单元格内容动态合并相同内容单元格
  18. 仙侣奇缘2 无法 启动mysql_仙侣奇缘2服务端
  19. 【期末复习】技术经济学(南邮储成祥)
  20. 智能手持终端CPU选型报告

热门文章

  1. c++------------之---【虚函数和抽象基类的应用】
  2. 计算机网络考试成绩分析报告,成绩分析报告范文_成绩分析总结与反思
  3. jsp oracle连接池,利用Oracle自带的连接池类的一例
  4. python traceback_深入学习Python列表(第一部分)
  5. ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)
  6. C++之指针探究(十):this指针
  7. 单片机点亮一个灯程序_初识单片机C语言编程,点亮第一个LED灯
  8. java里有没有 0的使用_请问有没有人有零基础Java基础习题?
  9. java删除多选项_java – 选项菜单默认灰色边框删除
  10. 计算机中 位数越多 能表示的状态,第2章 基本数据的表示与处理.ppt