精华内容
下载资源
问答
  • Saas系统架构的思考,多租户Saas架构设计分析

    万次阅读 多人点赞 2019-06-14 13:39:35
    创业公司都在尝试创建企业级别的应用cRM, HR,销售, Desk Saas系统。很多Saas创业公司也拿了大额风投。毕竟Saas相对传统软件的优势非常明显。 最近一年,有幸架构一个Crm saas 系统,上线了几个月来,各方面都...

            ToB Saas系统最近几年都很火。很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统。很多Saas创业公司也拿了大额风投。毕竟Saas相对传统软件的优势非常明显。   

    最近一年,有幸架构一个Crm saas 系统,上线了几个月来,各方面都比满意。整个系统创建过程,踩了很多坑,收获也比较多。总结一下Saas系统架构一些特点:

    Saas系统分级

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

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

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

        多租户可以分为几个不同的类别(如列表下方的图所示):
        1.1,云中的简单虚拟化,其中只对硬件进行共享。
        1.2,共享应用程序,对每个租户使用不同的数据库。
        1.3,共享应用程序和数据库(效率最高,真正的多租户)。

    1.分层设计

    Saas系统分层大概是:

    Saas系统分层
    Saas系统分层

     

    Saas系统分层:租户识别>应用层>数据访问层>缓存层>数据库

    业务代码都是写在应用层。

    租户识别可以用spring拦截器实现,然后使用ThreadLocal传递给后端

    数据库和缓存层对应用层应该是透明的。程序员在写代码的时候,只关心业务逻辑,不应该担心多租户的问题。

     

    2.数据隔离要透明

    saas系统说起来很简单,任何系统似乎加个tenant_id(租户id)就变成saas系统了。比如原来的用户登录是:

    select username,password from users where email='abc@qq.com'

    改成

    select username,password from users where email='abc@qq.com' and tenant_id =1;

    对于复杂业务的saas系统,这样做法非常危险,而且开发效率很低。你想想如果那个程序员写sql时候忘了加 “ and tenant_id =1” . 结果不堪设想。

    比较好做法是在数据库访问层对SQL进行改写。

    TenantContext.exec("select username,password from users where email='abc@qq.com' ");

    在连接池根据TenatnContext改写Sql. 

    这样做好处是,一来程序猿最多把系统搞down了,也不至于信息串了互相泄露。二来将来做分表分库也很方便,上层应用不用修改。

    3. 租户识别方案

    比较好做法是通过url识别租户。系统是给租户生成一个随机的三级域名,比如 abc.crm.baidu.com.   如果客户想使用自己的域名,可以在cname到我们生成的三级域名,并在管理系统里面做绑定。

    这样一个租户可以有两个域名,访问saas,一个随机生成的三级域名,另外一个租户自己的域名.代码里面可以根据过来的域名,判断是那个租户然后初始化TenantContext.

    如果不想通过域名来做,也可以通过登录名来判断。这种方式要涉及到租户切换问题。

    4. 智能DNS

    以后补充。

    5. 租户管理系统(计费,订购,定制,充值,催缴)

    Saas系统是必须考虑计费系统和租户控制系统。这个系统需要都是独立设计。比如那个租户购买了那些模块,一个月多少钱。租户可以创建最多的用户数。计费到期邮件提醒等功能。

    计费方式一般有两种,周期性计费,类似月租方案,和使用量计费,用多少付多少。 周期性计费比较简单。也可以两者结合起来。

    6. 定制化开发

    SAAS的优势在于一套系统多人使用,似乎和定制化开发有冲突。比如A客户想要A功能,B客户不想要。但定制化开发是无法避免的,比如CRM系统这样复杂的系统,不可能一套系统满足所有公司的要求。定制化开发尽可能分系统,分模块去做。然后通过控制台中配置不同租户订购不同模块,那些模块可以在前端页面上显示。不同的子系统需要分开部署。前端可通过nginx根据url分发,比如 abc.crm.baidu.com/bi/xxx/xx这个地址,就分发到BI子系统。不要尝试OSGI去搞模块化,这个是个大坑。

    还有开发和产品,现有需求一定要分析清楚,不要一上线发现后患无穷。新功能尽量做的独立可以配置。

    7. 灰度升级

    SAAS付费企业客户对系统问题都特别敏感。 为了减少升级可能出现问题的影响范围,一般都采用灰度升级策略。如果使用了url来区分不同租户,灰度升级配置就会很方便。可以配置nginx 来根据域名做分发,比如租户A(aaa.com)到实例1(版本1.0),租户B(bbb.com)到实例2(版本). 当需要域名配置非常多的时候,nginx配置文档会乱。这块时候可以考虑使用nignx_lua来写一些扩展模块。

    8. 容量估计

     

    9. Saas平台架构分层分析

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

     

    saas平台架构之呈现层:

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

    saas平台架构之调度层:

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

    saas平台架构之业务层:

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

    saas平台架构之数据层:

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

    以上是对“Saas系统架构的思考,多租户Saas架构设计分析”的介绍,从saas平台架构处理数据可以看出saas平台的应用有很强的优势,如用户使用saas非常方便简单只要浏览器或本地客户端接口,saas平台处理数据要经过层层认证saas产品安全可靠,saas平台优化处理数据提高saas性能。

    多租户Saas系统架构还应该满足以下需求:

    编号需求描述
    1软件授权云平台付费授权机制,可按时间、功能、数量等进行付费授权
    2组织入驻允许组织主动申请加入平台
    3实名认证个人实名认证、组织实名认证
    4资质审核个人和组织的资质审核,如对获得的证书或荣誉进行审核
    5组织绑定个人账户绑定组织,与组织建立关联关系
    6组织解绑个人账户与组织进行解绑
    7账户注销个人账户注销,并销毁所有个人资料和档案
    8统一登录即 SSO
    9统一注册提供统一的用户注册页面

    部分资料整理自:

    http://www.ruanally.com
    ​​​​​​​http://qk.gam7.com
    ​​​​​​​​​​​​​​http://www.ruanbe.com

     

    展开全文
  • 多租户Saas架构设计分析(实践篇)

    万次阅读 多人点赞 2020-02-11 15:30:14
    上一篇文章已经将SaaS架构做了一个简单的介绍和分析,此篇进入实践篇。 基础篇链接:https://blog.csdn.net/haponchang/article/details/104242482 具体的SaaS架构必须 1.先仔细选择最适合应用程序需求的租户...

    上一篇文章已经将SaaS架构做了一个简单的介绍和分析,此篇进入实践篇。

    基础篇链接:https://blog.csdn.net/haponchang/article/details/104242482

     

    具体的SaaS架构必须

    1.先仔细选择最适合应用程序需求的租户模型,

    2.需要根据租户模型来选定最终的架构,即应用程序设计和管理每个租户的数据如何映射到存储等等。

    避免因租户模型的切换而付出昂贵的代价。

    租户模型  --》 应用程序设计 + 数据设计方案

     

    影响租户模型的相关因素包括:

    可扩展性(Scalability

    • 租户的数量级
    • 每个租户的存储级别
    • 整体存储
    • 工作负载

    租户隔离性(Tenant isolation

    • 数据隔离和性能(是否一个租户的负载会影响到其他租户)

    单租户成本(Per-tenant cost

    • 数据库成本

    开发复杂度(Development complexity

    • 数据结构的变化
    • 查询语句的变化

    运维复杂度(Operational complexity

    • 性能监控
    • 数据结构schema管理
    • 租户数据恢复
    • 灾备

    可定制化程度(Customizability

    • 根据租户的需求自定义架构的容易程度

    这个租户的讨论集中在数据层。但考虑一下应用层。应用程序层被视为一个整体实体。如果将应用程序划分为许多小型组件,您的租户模型选择可能会发生变化。对于租户和存储技术或使用的平台,您可以对其他组件进行不同的处理。

     

     

    常见的架构模式有以下几种:

    这个模型中,应用层和数据层都是隔离的。

    应用程序的每个实例都是独立实例。

    租户拥有自己独立的数据库,每个应用程序实例只需要一个数据库。 

    对租户的管理独立于系统之外,对于每一个租户,整个应用程序需要重复安装一次。供应商都可以为租户管理软件。每个应用程序实例都配置为连接到其相应的数据库。

    优点:为不同的租户提供独立的应用实例和数据库,有助于简化数据模型和业务模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复系统或数据均比较简单,系统间也不会相互影响。

    问题:数据库层面,每个租户数据库都作为独立数据库进行部署。该模型提供了最大的数据库隔离。但隔离需要为每个数据库分配足够的资源来处理其高峰负载。这里重要的是, 弹性池不能用于部署在不同资源组或不同订阅中的数据库。这种限制使得这种独立的单租户应用程序模型成为从整体数据库成本角度来看最昂贵的解决方案;应用层面,每个租户若存在个性化定制,则需要对项目进行横向扩展,扩展时务必需要保证与主干版本的兼容性问题。运维层面,应用和数据库的安装数量会随租户的数量线性递增,随之带来维护成本和购置成本的增加。

     

    这个模型中,应用层是共享的,数据层都是隔离的。

    应用程序仅部署一套,所有租户实例共享。

    租户仍拥有自己独立的数据库,应用程序需对接多个租户的数据库。 

    对租户的管理由配置中心(Config Server)管理,配置中心提供了配置,监视和管理共享所需的功能,供应商使用这些工具为租户管理软件。对于每一个租户,整个应用程序仅需要安装一次,应用程序实际请求结合配置中心请求相应的数据库。

    优点:为不同的租户提供独立数据库,有助于简化数据模型扩展设计,满足不同租户的独特需求;如果出现故障,数据恢复均比较简单,也可以自动将单个租户恢复到较早的时间点。因为恢复只需要恢复存储租户的一个单租户数据库。这种恢复对其他租户没有影响,这证实了管理运营处于每个租户的细粒度级别。应用层面的维护成本和购置成本有所减少。

    问题:数据库层面,同模型一;应用层面,每个租户若存在个性化定制,则需要对项目进行横向扩展,扩展时务必需要保证与主干版本的兼容性问题。运维层面,数据库的运维问题同模式一,应用层面的运维在版本控制的问题上难度有所增加。

     

    这个模型中,应用层是共享的,数据库共享,但数据是隔离的。

    应用程序和数据库仅部署一套,所有租户共享。

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

    应用程序需对接多个租户的数据库。 

    对租户的管理由配置中心(Config Server)管理,同模式二。

    优点:为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可支持更多的租户数量。

    问题:数据库层面,如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据;应用层面,配置中心需要对租户信息进行完整且合理的分配和维护。

     

    模型与模型三的差别在于共享数据库,共享 Schema,共享数据表。也就是说共同使用一个数据库一个表使用字段进行数据隔离如表中增加TenantID多租户的数据字段。这是共享程度最高、隔离级别最低的模式。

    简单来讲,即每插入一条数据时都需要有一个客户的标识。这样才能在同一张表中区分出不同客户的数据,这也是我们系统目前用到的(tenant_id)。

    优点:方案的维护和购置成本低,允许每个数据库支持的租户数量最多。

    缺点:隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

     

    模式五与之前的模式的最大区别是,在原有的web Service进行细化拆分,优化成 网关+前台+中台+数据存储的模式。

    网关用于接收租户的请求,并发送给前台。

    前台的数量与租户一致,每一个租户对应一个前台服务,方便针对租户进行个性化定制。

    中台负责提供处理所有的业务请求,中台不关心租户是谁,将重心关注在业务的处理上。配置中心用于配置租户的接口权限、流程定制等相关配置信息。结合业务逻辑返回给前台特定租户的相关信息。

    数据库模式参考模式四。

     

    优点:有利于定制不同租户的个性化需求。例如:交互界面不同、工作流不同等等。

               服务只需要根据用户需求在前台做相应的横向扩展即可;

               不同租户间服务相互独立,互不影响。

    缺点:模块划分需要做好划分,重点注重业务之间的低耦合;

               调用链路变长,需要做一定的优化处理;

               模块纵向拆分后,后期研发和运维难度均会有所增加;

     

    展开全文
  • 多租户Saas架构设计分析(基础篇)

    万次阅读 2020-02-10 11:09:05
    本篇先给大家介绍一下相关的概念和常见... SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式。...

    本篇先给大家介绍一下相关的概念和常见问题。

    实践篇链接:https://blog.csdn.net/haponchang/article/details/104246317

     

    SaaS简介

            SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式

            SaaS这个说法是区别于以往软件购买和交付方式而提出来的。在以前,你公司要使用一款软件来管理财务记账的时候,那你要向软件提供公司说明需求、支付购买软件的钱并提供安装软件的硬件环境,然后软件公司就会上门安装调试软件,调试完后就可以正式投入使用了。这里有一个很显著的特点是,软件都安装在你指定的地方,你拥有100%的管控权,相应的你后续还需要继续投入人员和资源维护系统的正常运行。

            SaaS(软件即服务)的模式就不一样了,在客户还没有来之前,软件提供公司就自己提服务器、数据库等硬件,把软件安装发布好,作为一个软件使用方就变得轻松许多,一上来就可以直接体验了,体验之后,你觉得哪些功能合适你的,就挑出来,按月支付支付比较便宜的费用就可以正式使用了。后续的升级、维护也由软件公司来负责,把所有的软件相关工作都归类准备好了,你直接过来挑自己需要的用就好了,其他的用户过来也是一样。“按需付费”是SaaS的一个非常重要的特性。在这种模式下,软件是别人的,发布在别人的服务器上,数据也需要保存在别人的服务器上,安全和信任一直是个令人担忧的问题。

            业内有一个很恰当的比喻,一开始的时候,各家都自己挖井抽水蓄水,挖井抽水蓄水的技术是有专业的公司提供,但总的来说喝水这个事情是自家管自家的,这是传统的软件的供水模式。SaaS模式下,挖井抽水蓄水净水修水管这些工作对使用方来说都是透明的,你有需要的时候就打开水龙头取水就OK了,然后每月自来水公司会过来跟你结算。同样的,优缺点很明显,优点是按需用水省事了,成本变低了,缺点是水由水务公司完成控制供水稳定性、供水质量取决于水务公司实力。

     

    SaaS平台基础分层架构

    Saas系统分层:展现层>调度层(租户识别)>业务层>数据层

    呈现层

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

    调度层(租户识别)

    saas平台架构的调度层体现分布式系统的特性之一。

    调度层可包含一个配置中心,其中存放租户租赁服务的相关服务配置信息以及版本号,调度层首先认证并识别租户,根据租户在配置中心的配置信息,向业务层发送用户请求(租户识别可以用spring拦截器实现,然后使用ThreadLocal传递给业务层),根据业务处理器的负载、业务特征进行合理的调度。通过应用这样的架构SaaS平台可以横向扩展。此外在存储、缓存等方面为了满足平台的横向扩展需求,调度层也必须具有良好的可扩展性

    业务层

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

    数据库和缓存层对业务层应该是透明的。程序员在写代码的时候,只关心业务逻辑,不应该担心多租户的问题。

    数据层

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

     

    saas核心组件

    1、安全组件

    在SaaS产品中,系统安全永远是第一位需要考虑的事情,如何保障租户数据的安全,是你首要的事情。这如同银行首选需要保障储户资金安全一样。安全组件就是统一的对SaaS产品进行安全防护,保障系统数据安全。

    2、数据隔离组件

    安全组件解决了用户数据安全可靠的问题,但数据往往还需要解决隐私问题,各企业之间的数据必须相互不可见,即相互隔离。在SaaS产品中,如何识别、区分、隔离多个租户的数据是你在实施SaaS软件架构设计时需要考虑的第二个问题。

    3、可配置组件

    尽管SaaS产品在设计之初就考虑了大多数通用的功能,让租户开箱即用,但任然有为数不少的租户需要定制服务自身业务需求的配置项,如UI布局、主题、标识(Logo)等信息。正因为无法抽象出一个完全通用的应用程序,所以在SaaS产品中,你需要提供一个可用于自定义配置的组件。

    4、可扩展组件

    随着SaaS产品业务和租户数量的增长,原有的服务器配置将无法继续满足新的需求,系统性能将会与业务量和用户量成反比。此时,SaaS产品应该具备水平扩展的能力。如通过网络负载均衡其和容器技术,在多个服务器上部署多个软件运行示例并提供相同的软件服务,以此实现水平扩展SaaS产品的整体服务性能。为了实现可扩展能力,就需要SaaS展示层的代码与业务逻辑部分的代码进行分离,两者独立部署。例如使用VUE+微服务构建前后端分离且可水平进行扩展的分布式SaaS应用产品。对于可扩展,还有另外一种方式,即垂直扩展,其做法比较简单,也比较粗暴:通过增加单台服务器的配置,如购买性能更好的CPU、存储更大的内存条、增大带宽等措施,让服务器能够处理更多的用户请求。但此做法对于提升产品性能没有质的改变,且成本很高。

    5、0停机时间升级产品

    以往的软件在升级或者修复Bug是,都需要将运行的程序脱机一段时间,等待升级或修复工作完成后,再重新启动应用程序。而SaaS产品则需要全天候保障服务的可用性。这就需要你考虑如何实现在不重启原有应用程序的情况下,完成应用程序的升级修复工作。

    6、多租户组件

    要将原有产品SaaS化,就必须提供多租户组件,多租户组件是衡量一个应用程序是否具备SaaS服务能力的重要指标之一。SaaS产品需要同时容纳多个租户的数据,同时还需要保证各租户之间的数据不会相互干扰,保证租户中的用户能够按期望索引到正确的数据,多租户组件是你必须要解决的一个问题。其余的组件都将围绕此组件展开各自的业务。

     

    SaaS成熟度模型分级

    Level1:定制开发,每次新增一个客户,都会新增软件的一个实例。

    Level2:可配置,所有客户都运行在软件的同一个版本上,而且任何的定制化都通过修改配置来实现。

    Level3:高性能的多租户架构(多租户[multi-tenant]、高层建筑[Highrise]),所有的客户都已经可以在软件的同一个版本上运行了,而且他们都在同一个“实例”上运行。

    Level4:可伸缩的多租户架构(多租户, 扩建[Build-Out]),此时你已经拥有了多租户、单一版本的软件模型。不过你还是可以通过硬件扩展(scale-out)的方式来进行扩充。

     

    多租户数据存储方案

    a. 隔离数据库

    b. 共享数据库,隔离数据结构

    c. 共享数据结构,tenantid字段隔离(推荐)

    注意的问题:数据隔离要透明

    saas系统说起来很简单,任何系统似乎加个tenant_id(租户id)就变成saas系统了。比如原来的用户登录是:

    select username,password from users where email='abc@qq.com'

    改成

    select username,password from users where email='abc@qq.com' and tenant_id =1;

    对于复杂业务的saas系统,这样做法非常危险,而且开发效率很低。你想想如果那个程序员写sql时候忘了加 “ and tenant_id =1” . 结果不堪设想。

    比较好做法是在数据库访问层对SQL进行改写。

    TenantContext.exec("select username,password from users where email='abc@qq.com' ");

    在连接池根据TenatnContext改写Sql. 

    这样做好处是,1. 系统信息串了互相独立,不易泄露。2.若将来做分表分库也很方便,上层应用不用修改。

     

    多租户优化

    数据库层性能优化(建立合适索引,消除大数据表连接,避免复杂SQL)

    应用层性能优化(Cache,统计报表,异步操作,基于租户的索引搜索)

    展现层性能优化

     

    多租户可配置性

    数据可配置(定制字段,预分配字段,键值对)

    功能可配置(原子功能划分,功能包设计,功能使用校验)

    界面可配置(系统菜单,页面元素)

    流程可配置

    可伸缩性

    负载均衡

    数据库读写分离

    数据库垂直切分/水平切分

     

    安全性

    应用安全(身份认证,权限管理,日志记录,应用监控)

    数据安全(数据隔离,数据库连接安全,敏感数据加密,数据量监控)

    网络安全(安全传输,网络攻击防范,网络监控)

     

    其他问题

    租户识别方案

    比较好做法是通过url识别租户。系统是给租户生成一个随机的三级域名,比如 abc.crm.baidu.com.   如果客户想使用自己的域名,可以在cname到我们生成的三级域名,并在管理系统里面做绑定。

    这样一个租户可以有两个域名,访问saas,一个随机生成的三级域名,另外一个租户自己的域名.代码里面可以根据过来的域名,判断是那个租户然后初始化TenantContext.

    如果不想通过域名来做,也可以通过登录名来判断。这种方式要涉及到租户切换问题。

     

    定制化开发

    SAAS的优势在于一套系统多人使用,似乎和定制化开发有冲突。比如A客户想要A功能,B客户不想要。但定制化开发是无法避免的,比如CRM系统这样复杂的系统,不可能一套系统满足所有公司的要求。定制化开发尽可能分系统,分模块去做。然后通过控制台中配置不同租户订购不同模块,那些模块可以在前端页面上显示。不同的子系统需要分开部署。前端可通过nginx根据url分发,比如 abc.crm.baidu.com/bi/xxx/xx这个地址,就分发到BI子系统。不要尝试OSGI去搞模块化,这个是个大坑。

    开发和产品,现有需求一定要分析清楚,不要一上线发现后患无穷。新功能尽量做的独立可以配置。

     

    灰度升级

    SAAS付费企业客户对系统问题都特别敏感。 为了减少升级可能出现问题的影响范围,一般都采用灰度升级策略。如果使用了url来区分不同租户,灰度升级配置就会很方便。可以配置nginx 来根据域名做分发,比如租户A(aaa.com)到实例1(版本1.0),租户B(bbb.com)到实例2(版本). 当需要域名配置非常多的时候,nginx配置文档会乱。这块时候可以考虑使用nignx_lua来写一些扩展模块。

     

    多租户Saas系统架构还应该满足以下需求:

    编号 需求             描述

    1 软件授权 云平台付费授权机制,可按时间、功能、数量等进行付费授权

    2 组织入驻 允许组织主动申请加入平台

    3 实名认证 个人实名认证、组织实名认证

    4 资质审核 个人和组织的资质审核,如对获得的证书或荣誉进行审核

    5 组织绑定 个人账户绑定组织,与组织建立关联关系

    6 组织解绑 个人账户与组织进行解绑

    7 账户注销 个人账户注销,并销毁所有个人资料和档案

    8 统一登录 即 SSO

    9 统一注册 提供统一的用户注册页面

     

    下篇会给大家介绍SaaS架构的实践篇:

    实践篇链接:https://blog.csdn.net/haponchang/article/details/104246317

     

    参考资料:https://blog.csdn.net/cnpinpai/article/details/91967335

    展开全文
  • 彻底理解微商城多租户Saas架构设计 原文链接:https://blog.csdn.net/haponchang/article/details/104246317,感谢作者提供这么好的总结! 1.具体的SaaS架构必须 1.先仔细选择最适合应用程序需求的租户模型, 2....

    彻底理解微商城多租户Saas架构设计

    原文链接:https://blog.csdn.net/haponchang/article/details/104246317,感谢作者提供这么好的总结!

    1.具体的SaaS架构必须


    1.先仔细选择最适合应用程序需求的租户模型,


    2.需要根据租户模型来选定最终的架构,即应用程序设计和管理、每个租户的数据如何映射到存储等等。


    避免因租户模型的切换而付出昂贵的代价。


    租户模型 --》 应用程序设计 + 数据设计方案



    2.影响租户模型的相关因素包括:

    2.1可扩展性(Scalability)

    • 租户的数量级
    • 每个租户的存储级别
    • 整体存储
    • 工作负载

    2.2租户隔离性(Tenant isolation)

    • 数据隔离和性能(是否一个租户的负载会影响到其他租户)

    2.3单租户成本(Per-tenant cost)

    • 数据库成本

    2.4 开发复杂度(Development complexity)

    • 数据结构的变化
    • 查询语句的变化

    2.5运维复杂度(Operational complexity)

    • 性能监控
    • 数据结构schema管理
    • 租户数据恢复
    • 灾备

    2.4可定制化程度(Customizability)


    根据租户的需求自定义架构的容易程度
    这个租户的讨论集中在数据层。但考虑一下应用层。应用程序层被视为一个整体实体。如果将应用程序划分为许多小型组件,您的租户模型选择可能会发生变化。对于租户和存储技术或使用的平台,您可以对其他组件进行不同的处理。






    3 常见的架构模式有以下几种:

    3.1独立服务+独立数据库


    在这里插入图片描述


    这个模型中,应用层和数据层都是隔离的。


    应用程序的每个实例都是独立实例。


    租户拥有自己独立的数据库,每个应用程序实例只需要一个数据库。


    对租户的管理独立于系统之外,对于每一个租户,整个应用程序需要重复安装一次。供应商都可以为租户管理软件。每个应用程序实例都配置为连接到其相应的数据库。


    优点:为不同的租户提供独立的应用实例和数据库,有助于简化数据模型和业务模型的扩展设计,满足不同租户的独特需求;如果出现故障,恢复系统或数据均比较简单,系统间也不会相互影响。


    问题:数据库层面,每个租户数据库都作为独立数据库进行部署。该模型提供了最大的数据库隔离。但隔离需要为每个数据库分配足够的资源来处理其高峰负载。这里重要的是, 弹性池不能用于部署在不同资源组或不同订阅中的数据库。这种限制使得这种独立的单租户应用程序模型成为从整体数据库成本角度来看最昂贵的解决方案;应用层面,每个租户若存在个性化定制,则需要对项目进行横向扩展,扩展时务必需要保证与主干版本的兼容性问题。运维层面,应用和数据库的安装数量会随租户的数量线性递增,随之带来维护成本和购置成本的增加。

    3.2一套服务+独立数据库

    在这里插入图片描述





    这个模型中,应用层是共享的,数据层都是隔离的


    应用程序仅部署一套,所有租户实例共享。


    租户仍拥有自己独立的数据库,应用程序需对接多个租户的数据库。


    对租户的管理由配置中心(Config Server)管理,配置中心提供了配置,监视和管理共享所需的功能,供应商使用这些工具为租户管理软件。对于每一个租户,整个应用程序仅需要安装一次,应用程序实际请求结合配置中心请求相应的数据库。

    优点 :为不同的租户提供独立数据库,有助于简化数据模型扩展设计,满足不同租户的独特需求;如果出现故障,数据恢复均比较简单,也可以自动将单个租户恢复到较早的时间点。因为恢复只需要恢复存储租户的一个单租户数据库。这种恢复对其他租户没有影响,这证实了管理运营处于每个租户的细粒度级别。应用层面的维护成本和购置成本有所减少。


    问题 :数据库层面,同模型一;应用层面,每个租户若存在个性化定制,则需要对项目进行横向扩展,扩展时务必需要保证与主干版本的兼容性问题。运维层面,数据库的运维问题同模式一,应用层面的运维在版本控制的问题上难度有所增加。

    3.3 一套服务+一套数据库(不同schema)


    在这里插入图片描述





    这个模型中,应用层是共享的,数据库共享,但数据是隔离的。


    应用程序和数据库仅部署一套,所有租户共享。


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


    应用程序需对接多个租户的数据库。


    对租户的管理由配置中心(Config Server)管理,同模式二。


    优点:为安全性要求较高的租户提供了一定程度的逻辑数据隔离,并不是完全隔离;每个数据库可支持更多的租户数量。


    问题:数据库层面,如果出现故障,数据恢复比较困难,因为恢复数据库将牵涉到其他租户的数据;应用层面,配置中心需要对租户信息进行完整且合理的分配和维护。

    3.4 一套服务+一套数据库(相同schema)

    在这里插入图片描述


    模型与模型三的差别在于共享数据库,共享 Schema,共享数据表。也就是说共同使用一个数据库一个表使用字段进行数据隔离。如表中增加TenantID多租户的数据字段。这是共享程度最高、隔离级别最低的模式。


    简单来讲,即每插入一条数据时都需要有一个客户的标识。这样才能在同一张表中区分出不同客户的数据,这也是我们系统目前用到的(tenant_id)。


    优点:方案的维护和购置成本低,允许每个数据库支持的租户数量最多。


    缺点:隔离级别最低,安全性最低,需要在设计开发时加大对安全的开发量;数据备份和恢复最困难,需要逐表逐条备份和还原。

    3.5网关+前台+中台+数据存储

    在这里插入图片描述


    模式五与之前的模式的最大区别是,在原有的web Service进行细化拆分,优化成 网关+前台+中台+数据存储的模式。


    网关用于接收租户的请求,并发送给前台。


    前台的数量与租户一致,每一个租户对应一个前台服务,方便针对租户进行个性化定制。


    中台负责提供处理所有的业务请求,中台不关心租户是谁,将重心关注在业务的处理上。配置中心用于配置租户的接口权限、流程定制等相关配置信息。结合业务逻辑返回给前台特定租户的相关信息。


    数据库模式参考模式四。

    优点:有利于定制不同租户的个性化需求。例如:交互界面不同、工作流不同等等。


    服务只需要根据用户需求在前台做相应的横向扩展即可;


    不同租户间服务相互独立,互不影响。

    缺点:模块划分需要做好划分,重点注重业务之间的低耦合;


    调用链路变长,需要做一定的优化处理;


    模块纵向拆分后,后期研发和运维难度均会有所增加;


    好文收集不易,请转发或在看,谢谢!

    在这里插入图片描述

    展开全文
  • 多租户技术或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。 多租户简单来说是指一个单独的实例可以为个组织服务。
  • 什么是多租户saas架构设计

    千次阅读 2021-10-24 18:59:31
    本文来说下什么是多租户saas架构设计经验 文章目录概述 概述
  • SaaS模式下多租户系统架构及关键技术研究_彭荣 很有价值的一篇论文
  • SaaS模式下多租户系统架构及关键技术研究 多租户共享数据库模型。
  • 多租户SaaS架构

    2017-10-05 10:46:00
    当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构。但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求。此外,SaaS平台堆栈还以API和WCF...
  • 多租户 Saas 系统架构的设计思路

    万次阅读 2019-09-06 09:45:22
    ToB Saas 系统最近几年都很火。很创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统。很多Saas创业公司也拿了大额风投。毕竟Sa...
  • 剖析SalesForce的多租户架构(PAAS\SAAS\云计算),作者吴朱华
  • 什么是多租户架构

    千次阅读 2020-01-21 14:32:12
     多租户定义:多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在用户环境下(此处的用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。简单讲:在一...
  • SaaS架构设计之如何转化成SaaS多租户模式
  •  随着互联网技术的迅速发展,...本文研究了SaaS的现状,并分析研究了SaaS的核心技术包括:SaaS模式体系结构设计、SaaS模式数据库架构设计,以及多租户技术、数据扩展技术、配置性技术等关键支撑技术的实现策略。
  • 提到SaaS,很多人都会立刻想到节约成本、按需付费、即租即用等等这些概念,这说明大部分人对SaaS已经有了普遍认知,且开始主动应用...企业管理者需要明白这两种SaaS架构的特点,才能更地从未来的功能需求、数据...
  • 如果我们开启了Eslint , 也就意味着要接受它非常苛刻的语法检查,包括空格不能少些或些,必须单引不能双引,语句后不可以写分号等等,这些规则其实是可以设置的。我们作为前端的初学者,最好先关闭这种校验,否则...
  • 最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。 ...
  • 文中基于SaaS模式提出定位于校级层面,能同时为高校各部门服务的IT资产管理系统。该系统通过接入高校统一身份认证消除数据孤岛现象,其功能全面且运维成本较低,能够实现对IT资产的全生命周期管理,满足高校信息化...
  • 针对SaaS模式下面向多租户SaaS软件如何随着用户数量及请求规模的变化而进行自适应伸缩的问题,在分析SaaS软件的可伸缩需求的基础上,从一个较为宏观的角度提出了一个面向多租户层次可伸缩SaaS软件架构....
  • 1. 概述 笔者从2014年开始接触SaaS(Software as a Service),即多租户...最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于...
  • SaaS多租户架构摘抄

    2020-10-08 11:39:05
     多租户定义:多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在用户环境下(此处的用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。简单讲:在一...
  • 干货分享!Saas架构如何针对确保安全性、创建可扩展数据模型以及数据基础结构的可扩展性等方面进行设计,本文给出答案!
  • 您的应用程序需要多租户基础架构,并且您不想浪费时间脱离业务规则吗? 使用MulT,将TenantModel继承到您自己的模型上,无需再花时间在体系结构上。 以及可以自定义主题的每个租户的自定义模型。 还有许多其他功能...
  • 在设计多租户SaaS应用程序时,您必须仔细选择最适合您应用程序需求的租户模型。租户模型确定每个租户的数据如何映射到存储。您选择的租户模式会影响应用程序设计和管理。以后切换到另一个模型有时代价昂贵。 关于可...
  • 提到SaaS,很多人都会立刻...企业管理者需要明白这两种SaaS架构的特点,才能更地从未来的功能需求、数据安全等方面进行考虑,从而选出适合企业应用的SaaS软件。 本文将通过举例,形象深刻解释“SaaS多租户和单租户
  • 采用“共享数据库,共享数据架构方案”,重点在于租户管理和数据隔离,租户管理:包括注册、订购、计费等,数据隔离:变更表结构,增加tenant_id字段。 二、租户管理 1.注册 2.订购 3.计费 三、数据隔离 ...
  • 前面曾经写过一篇Springboot项目实现租户的方案,当时用的是每个租户独立数据库,通过切换数据源的方式来实现,看这篇Springboot项目使用动态切换数据源实现多租户SaaS方案,这篇我们说一下,方案三通过共享数据库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,519
精华内容 1,807
关键字:

多租户saas架构