最近做的项目涉及到比较深入的一部分,就是定义客户关系,在我们的商讨中,我们决定,采用服务商的模式,就是我们是基础服务商,由客户组合服务,向客户提供基于云端的服务支持!这就自然引出了以下概念:

saas百科:

SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式。它与“on-demand software”(按需软件),the application service provider(ASP,应用服务提供商),hosted software(托管软件)所具有相似的含义。它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理企业经营活动,且无需对软件进行维护,服务提供商会全权管理和维护软件,软件厂商在向客户提供互联网应用的同时,也提供软件的离线操作和本地数据存储,让用户随时随地都可以使用其定购的软件和服务。对于许多小型企业来说,SaaS是采用先进技术的最好途径,它消除了企业购买、构建和维护基础设施和应用程序的需要。

那么,问题来了,怎么针对不同的用户提供一种高效,安全的基础数据服务呢?本着我们想到的问题,肯定有人遇到过的原则,我们搜索到了一个解决方案:

多租户(multi-tenancy)

  意指在其中一个应用程序的运行实例同时服务多个客户端(租户)体系结构。这是非常常见的SaaS解决方案。

关于多租户的实现,大概有三种:“N个租户N个数据库”,“N个租户1个数据库N个Schema”,“N个租租户1个数据库1个Schema”

1.分离数据库(Separate Databases)

“N个租户N个数据库”

每个租户的数据保存在一个物理上独立的数据库实例。JDBC连接会特别指出每个数据库。一个通用的应用程序的方法是定义一个JDBC连接池,当前登录的用户关联的"租客标识符"来选择JDBC连接.
好处:可以轻松地扩展应用程序的数据模型(稍后讨论)以满足住户的个别需求,而且在失败时从备份恢复租客的数据是一个相对简单的过程。
坏处:导致更高的设备成本,以及维护和备份租客数据方面的成本。
相对较高的硬件,维护成本使它适合于愿意额外支付增加的安全性和可定制性的客户。例如,在银行或医疗记录管理等领域的客户往往有很强的数据隔离的要求,甚至不得不不为每个租客提供具有其自己单独的数据库。

2.共享数据库,彼此独立的Schema(Shared Database, Separate Schemas)

“N个租户1个数据库N个Schema”
每个租客有它自己的表,可以理解为为每个租客分表.每个租客在共享的数据库中具有其自己单独的一组表.当客户第一次订阅该服务时,资源调配子系统为租客创建一组离散的表,并将它与租客的Schema关联。您可以使用 SQL 创建命令创建一个架构,并授权用户帐户来访问它。应用程序然后可以创建和访问表内的租户的架构使用SchemaName.TableName公约:
CREATE TABLE ContosoSchema.Resumes (EmployeeID int identity primary key,Resume nvarchar(MAX));
创建Schema后,它是作为租客帐户的默认Schema设置:
ALTER USER Contoso WITH DEFAULT_SCHEMA = ContosoSchema
租客帐户可以访问其默认架构内的表,只是通过指定TableName,而不是使用SchemaName.TableName.这种方式,一组 SQL 语句可以给所有的租客使用来访问其自己的数据,例如:SELECT * FROM Resumes

优点:

这样是容易实现的一种方法,租户可以与单独的数据库方法一样扩展数据模型。(创建的表但一旦不符合需求,租客可添加,修改表)

这种方法提供了中等程度的逻辑数据隔离安全,虽然比不上作为一个完全独立的数据库,但却可以在每个数据库服务器支持大量的租户。

缺点:

数据出现故障时是难以恢复某租客。如果每个租客有其自己的数据库,则还原单个租户的数据意味着简单地从最近的备份还原数据库。而这个方法则意味着用备份的数据还原整个数据库,而不管在同一数据库上的每个租客的数据是否遭到损失。因此,要还原单个客户的数据,数据库管理员可能需要将数据库还原到一个临时的服务器,然后将客户的表导入到生产服务器上 — — 一个复杂和可能很耗时的任务。

3.共享数据库,共享Schema(Shared Database, Shared Schema)

“N个租租户1个数据库1个Schema”
这个方法就是最简单的一种了.每个表使用租客的一个标识符.所有租户都共享一组相同的表,一个租客 标识符ID 将每个租客与它拥有的行相关联.

优点:

最低硬件和备份成本,因为它允许每个数据库服务器服务更多的租户。然而,因为多个租户共享相同的数据库表,这种方法可能会导致安全问题,你必须努力确保租户始终不能访问其他租户的数据,即使在发生意外。

缺点:

对于租客还原数据的过程是类似于共享架构方法,要重新插入临时数据库单个行到生产数据库中。如果有非常大量的受影响的表中的行,这可能导致性能明显降低数据库服务的所有住户。共享架构方法能够用少量的服务器,服务一大批租户和潜在客户,如果他们愿意用更低的费用获取安全性.

每次CRUD都需要使用对应租客 标识符ID.SQL变得复杂.

总结:

SaaS的概念在很久以前,是我们通过部署N个程序来完成的为多个用户服务,但是在咱们程序的维护上,增加了太多的成本,本着硬件能解决的问题,软件都能解决,有了这个概念,实际这不是全新的概念,而是为了解决一组问题而提出的解决方案!今天咱们充足了弹药,在下一篇博客,咱们一起将它实现吧!

java工程积累——saas之multi-tenancy解析相关推荐

  1. java工程积累——项目管理:破窗理论

    年后这段时间,我一直带着项目,在项目中,最后总会遇到这样那样的问题,搞得自己有些狼狈!在向我的恩师求助后,我翻阅了一些资料和书籍,最后找到了一个特别有意思的问题!就是咱们的题目,破窗理论,咱们一起来探 ...

  2. java面试题saas

    第1天 技能 1. 能够使用maven分模块构建项目 2. 可以使用pd绘制用例图 面试题 maven的作用是什么? 依赖管理:对jar包的管理一键构建:通过一个命令来完成项目的构建过程 maven的 ...

  3. java spring省略jsp,Java +Tomcat + SpringMVC实现页面访问示例解析

    window7下Java环境安装记录: 一.安装Tomcat 1.下载tomcat 7.0,解压,无需安装,放置到目录:D:\apache-tomcat-7.0.90. 2.配置系统环境变量,CATA ...

  4. java 工程文件改名后显示绿色加号_Gradle学习记录018 构建java JVM工程 part1

    详细学习如何用Gradle构建标准的java项目.第一部分.该学习记录基于Gradle官方网站资料.本篇参考链接如下: https://docs.gradle.org/current/userguid ...

  5. java零碎要点---用java实现生成二维码,与解析代码实现

    创梦综合技术qq交流群:CreDream:251572072 二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编 ...

  6. 面试必备:《Java 最常见 200+ 面试题全面解析》

    春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面.更深入的了解 Java 技术? 这里能够给你想要的所有答案? 给准备面试的大 ...

  7. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  8. [置顶]使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包...

    作者:chenzhou123520 出处:http://chenzhou123520.iteye.com/blog/1706242 使用 maven 插件 maven-shade-plugin 对 j ...

  9. 【Java集合框架】ArrayList类方法简明解析(举例说明)

    本文目录 1.API与Java集合框架 2.ArrayList类方法解析 2.1 add() 2.2 addAll() 2.3 clear() 2.4 clone() 2.5 contains() 2 ...

最新文章

  1. 2020牛客多校G[并查集的两种思想,按秩合并+路径压缩]
  2. python-mysql的安装和基本操作
  3. python模式选择符,Python设计模式之修饰器模式
  4. FreeRTOS任务通知
  5. 操作系统文件分配策略_操作系统中的文件分配方法
  6. 图书管理系统——运行及总结
  7. python在不同系统代码区别_python不同系统中打开方法
  8. c++用一级运算比较大小_python学习五-python运算符
  9. matlab中unique的作用,matlab中的unique函数详解
  10. 教您在Excel中批量生成二维码
  11. Leetcode 1653. Minimum Deletions to Make String Balanced [Python]
  12. 裂变活动的5个关键步骤?
  13. MySQL 性能优化的 9 种知识,面试再也不怕了
  14. 使用cookie实现一周内自动登录
  15. CSS:三种背景(斑马线,棋盘,格子)
  16. Fuzzing及Sulley简介
  17. 计算机专业实习计划包括哪些,计算机专业实习计划.doc
  18. 并行计算综述————第一章 并行计算硬件平台:并行计算机
  19. 青岛大学开源OJ平台搭建
  20. 为什么D类音频功放可以免输出滤波器

热门文章

  1. Nginx官方文档(十一)【HTTP之ngx_http_core_module】
  2. 用自己打工挣的钱,他创办广告公司,总资产已达3000多万
  3. 读书笔记_002 甘于平凡而不甘于平凡的腐烂——《平凡的世界》所感
  4. python爬虫小项目挣钱兼职,python程序员兼职平台
  5. 什么是粘包?socket 中造成粘包的原因是什么? 粘包的处理方式
  6. 优化理论12---- Rosen的梯度投影法 、投影矩阵
  7. android x86睡死,【已解决】xps15 睡眠睡死
  8. Excel如何对单元格内的分隔数据进行求和操作?
  9. Scala-scalaMap转JSON字符串和javaMap
  10. 绿茶集团在港上市申请再失效:王勤松夫妇为实控人,翻台率不及格