深入理解SaaS之架构篇

一、SaaS的技术选型(从Java的角度出发)

  • 分布式网关(GateWay、Zuul、Nginx、Kong);
  • 缓存(Redis、MemCached、EhCache);
  • 搜索(ElasticSearch、Lucene/Solr);
  • 限流熔断(Hystrix、Sentinel);
  • 分布式注册中心(Eureka、Nacos、Consul、Etcd、Zookeeper);
  • 定时任务以及分布式定时任务(Shedule、Quartz、XXl-Job、Elastic-Job等);
  • 分布式事务(Seata、Tx-LCN、ByteTCC);
  • 分布式日志系统(ELK);
  • 分布式服务权限(OAuth1.0/2.0、JWT、Shiro、Spring Security);
  • 应用诊断(Arthas);
  • 分布式调用链(SkyWalking+RocketBolt、Zipkin);
  • 分布式锁(Redisson);
  • 分布式服务流程编排(Coroutine,Akka,Kilim,Flowable,Axon);
  • 压测平台(JMeter,LoadRunner);
  • 分布式全局主键系统(Redis,Zookeeper,Twitter Snowflake);
  • 分布式自动化API文档(Swagger);
  • 分库分表中间件(Sharding Sphere,MyCat);
  • 消息中间件(RocketMQ,Kafka,ActiveMQ、RabbitMQ);
  • 分布式缓存(Redis、MongoDB);
  • 文件系统(OSS、NFS、FastDFS);
  • RPC(Dubbo、Motan、Thrift、gRPC);
  • 构建工具(Maven、Gradle);
  • 基础框架(SpringBoot+MyBatis/SpringBoot+MyBatis-Plus、SSM框架(Spring+SpringMVC+MyBatis));
  • 前端技术选型(html/css/js三剑客、React.js、Vue.js、Angular.js等)。

上面的技术选型既可支撑单体应用,也能支撑分布式微服务应用。
笔者曾写过一篇关于单体和分布式微服务的思考,感兴趣的朋友可以阅读:
从单体架构到分布式微服务架构的思考

二、SaaS系统分级

从”混乱”到”乌托邦”,一共5级。

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

三、SaaS平台架构分层

Saas平台架构需要完成从用户申请链接SaaS到用户对自己购买的功能模块的应用整个过程,用户用起SaaS看似简单快捷,但这个过程却需要SaaS平台架构默默完成的非常复杂的处理过程。通过对SaaS平台架构的了解,可以清晰的分化数据的处理过程,让用户也可以明白saas平台架构处理数据的优势。

1.呈现层

SaaS平台架构的呈现层可以使用的客户端如浏览器或软件客户端。如果是浏览器则需要Web界面技术、交互技术等技术(如:HTMl5技术、CSS3技术、Ajax技术等)的支持,如果是软件客户端则需要远程桌面技术、软件交互技术等技术支持。

2.调度层

SaaS平台架构的调度层体现分布式系统的特性之一。调度层首先负责识别并通过AAA认证每个用户请求,然后根据业务处理器的负载、业务特征进行合理的调度。通过应用这样的架构SaaS平台可以横向扩展。此外在存储、缓存等方面为了满足平台的横向扩展需求,调度层也必须具有良好的可扩展性。

AAA认证解释:
AAA是认证(Authentication)、授权(Authorization)和计费(Accounting)的简称,是网络安全中进行访问控制的一种安全管理机制,提供认证、授权和计费三种安全服务。

3.业务层

SaaS平台架构的业务层负责接收调度层转发过来的请求,而且还要通过对接受到的请求执行真正的业务逻辑。一般来说业务逻辑的执行使用一台服务器就够了。因此业务层实际是由一排对等的服务器组成的,每台服务器都执行相同的业务逻辑。

4.数据层

SaaS平台架构的数据库集群用于处理存储关系性很强并且对事务性要求很高的业务数据,这类数据目前还要用传统的数据库集群技术来解决,SaaS平台架构的数据库集群主要是根据业务特征制定数据拆分方案。同时分布式数据库用于存放海量但关系性不强的数据(如:用户的操作日志等)。

四、SaaS的技术架构核心是多租户

1.什么是多租户?

多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。简单讲:在一台服务器上运行单个应用实例,它为多个租户(客户)提供服务。从定义中我们可以理解:多租户是一种架构,目的是为了让多用户环境下使用同一套程序,且保证用户间数据隔离。那么重点就很浅显易懂了,多租户的重点就是同一套程序下实现多用户数据的隔离。

2.多租户架构以及数据隔离方案

多租户在数据存储上主要存在三种方案,分别为如下:

  • 独立数据库;
  • 共享数据库,独立Schema;
  • 共享数据库,共享Schema,共享数据表。

(1)独立数据

即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本较高。

  • 优点:为不同的租户提供独立的数据库,有助于简化数据模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复数据比较简单。
  • 缺点:增多了数据库的安装数量,随之带来维护成本和购置成本的增加。

(2)共享数据库,独立Schema

也就是说,共同使用一个数据库,使用表进行数据隔离
多个或所有租户共享Database,但是每个租户一个Schema(也可叫做一个user)。底层库比如是:DB2、ORACLE等,一个数据库下可以有多个SCHEMA。

  • 优点:为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可支持更多的租户数量。
  • 缺点:如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据。

(3)共享数据库,共享Schema,共享数据表

也就是说,共同使用一个数据库一个表,使用字段进行数据隔离
即租户共享同一个Database、同一个Schema,但在表中增加TenantID多租户的数据字段。这是共享程度最高、隔离级别最低的模式。
简单来讲,即每插入一条数据时都需要有一个客户的标识。这样才能在同一张表中区分出不同客户的数据,这也是我们系统目前用到的(tenant_id)

  • 优点:三种方案比较,第三种方案的维护和购置成本最低,允许每个数据库支持的租户数量最多。
  • 缺点:隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

3.多租户架构设计需要考虑因素有哪些?

  • 成本因素;
  • 安全因素;
  • 租户数量;
  • 技术储备。

(1)成本因素

隔离性越好,设计和实现的难度和成本越高,初始成本越高。共享性越好,同一运营成本下支持的用户越多,运营成本越低。

(2)安全因素

要考虑业务和客户的安全方面的要求。安全性要求越高,越要倾向于隔离。

(3)租户数量

  • 系统要支持多少租户?上百?上千还是上万?可能的租户越多,越倾向于共享。
  • 平均每个租户要存储数据需要的空间大小。存贮的数据越多,越倾向于隔离。
  • 每个租户的同时访问系统的最终用户数量。需要支持的越多,越倾向于隔离。
  • 是否想针对每一租户提供附加的服务,例如数据的备份和恢复等。这方面的需求越多,越倾向于隔离。

(4)技术储备

共享性越高,对技术的要求越高。

4.常见的架构模式有哪些?

  • 独立服务+独立数据库;
  • 一套服务+独立数据库;
  • 一套服务+共享数据库;
  • 多套服务+独立数据库;
  • 多套服务+共享数据库。

五、我过去参与的创业公司,针对SaaS相关的架构设计是如何设计的?

从从0到1的设计与开发角度来看,我们所开发的智能酒店+智能门锁以及编程教育平台主要采用架构模式为多套服务+共享数据库。在采用该架构模式的过程中,遇到了很多问题,技术难度也非常大。如果不能战胜这个巨大的困难时,那么我们的产品将会形同烂尾楼似的,越到后面越不行。所幸的是算是成功突破了。在成功突破的这一过程中,使我深刻明白了《劝学》中的一句话,”君子性非异也,善假于物也”。
下面进入相关的细节,针对智能酒店+智能门锁系统,我们的多租户架构设计是如何考虑的:

  • 从成本的角度,我们采用共享数据库,通过租户ID标识,支持更多的客户;
  • 从安全的角度,共享数据库的隔离性不如独立数据库,安全性主要体现在数据方面,针对不同客户的数据我们采用不同的实时备份策略,以保证系统如果突发故障导致数据丢失,我们能在短时间内恢复数据(涉及大量的运维框架和技术),让系统正常运行;
  • 从租户数量的角度来看,我们的租户预计上百万(可能还不止),我们有一个专门的存储服务器用来保证每个租户存储空间的独立性和完整性,文件存储与数据库存储分离状态,同样为了保证系统的可用性,我们采用的集群模式,通过服务冗余的形式最大程度保证系统服务的可用性;
  • 从技术储备的角度来看,我们做的不太好,通过后面不断的学习暂时性弥补了一部分,技术储备很重要,当面对业务需求时,采用合适高效的技术方案能够快速实现,让系统早点上线,让客户能尽早使用并给予反馈。

对我在创业公司经历感兴趣的朋友可以阅读如下文章:
一位北漂在创业公司的两年(详细概括,两万多字)
创业公司这两年
谈谈在创业公司的几点感触

参考资料如下:
多租户 Saas 系统架构的设计思路
Spring Boot集成Mybatis-Plus多租户架构实战
AAA 网络安全系统

文章目录
  1. 一、SaaS的技术选型(从Java的角度出发)
  2. 二、SaaS系统分级
  3. 三、SaaS平台架构分层
    1. 1.呈现层
    2. 2.调度层
    3. 3.业务层
    4. 4.数据层
  4. 四、SaaS的技术架构核心是多租户
    1. 1.什么是多租户?
    2. 2.多租户架构以及数据隔离方案
      1. (1)独立数据
      2. (2)共享数据库,独立Schema
      3. (3)共享数据库,共享Schema,共享数据表
    3. 3.多租户架构设计需要考虑因素有哪些?
      1. (1)成本因素
      2. (2)安全因素
      3. (3)租户数量
      4. (4)技术储备
    4. 4.常见的架构模式有哪些?
  5. 五、我过去参与的创业公司,针对SaaS相关的架构设计是如何设计的?