近期做SaaS应用的非常多,这样的模式是未来的一种趋势,这样的模式的最大优点就是云计算的优点--节约资源。网上有非常多人觉得SaaS非常easy,就是一个多用户租赁模式。这样的认识也不能说不正确。由于SaaS确实一般都採用多用户租赁模式。但这样的说法非常的不全面。是一种盲人摸象。并且非常多人觉得SaaS模式的架构非常easy,那就仅仅能说他没有真正做过SaaS模式或者他们做的SaaS应用是一种非常低级的模式,根本谈不上是云计算的范畴,就是一个把局域网的东西放到了公网而已。

作为一种云计算模型,一个典型的SaaS模式须要下面三种计算模型支撑:
1)分布式计算模型
      这是主要的模型。也是后两种模型的基础;如今非常火的Hadoop事实上仅仅是分布式计算模型中一种,并且并非特别的复杂;
2)分布式数据存储和訪问模型
      这样的模型非常多。GFS。HFS。TFS都属于这类,当然一些分布式数据库包含阿里的Ocean数据库都属于这一类。分布式数据库訪问和存取模型是SaaS企业应用的基础,对于企业级的应用底层数据节点不採用数据库当然是能够的,但假设採用数据库。优点也是非常多的。至少要简单非常多。现有的分布式数据库对于SaaS应用,特别是SaaS企业应用来说採用GreenPlum这类数据库并非不能够。但须要依据你的SaaS应用的业务本身进行权衡(主要是数据分离方式和效率的问题)。

特别是牵扯到关联查询的时候。对于一个按用户分离和隔离的企业应用,假设数据节点採用关系数据库,那么80%的企业应用的关联查询都会落到一个节点中,查询的效率会比較高。假设採用分布式数据库,一般都非常难做到这点,由于分布式数据库处理这类查询的时候,都须要把数据集中到一个节点进行处理。尽管能够採用一些策略来降低无效数据的传输。但往往效果不大。(分布式数据库中的A表和B表并不一定在一个数据节点的),这也是我一直以来的观点:对于分布式计算,通用往往代表着效率更低。

我比較认同Google的GFS设计理念:面向应用设计接口。
3)分布式部署与运维模型
     作为云计算下的SaaS应用,必须是能够支撑横向扩展(Scala out)的,而这些节点(包含应用节点和数据节点)的添加和管理全然靠人力去完毕。基本是不可能的事情。因此仅仅要是云计算模型下的SaaS应用,分布式部署与运维支撑模型就是必须的:应用程序节点的实时监控,管理和部署。数据节点的实时监控和部署,缓存节点的监控。管理和部署,文件server的监控。管理和部署等等。

以上三种模型就构成了SaaS应用的基础。但SaaS应用又有自己的特殊性。由于牵扯到商务逻辑、事务处理(高一致性和准确性)以及数据的整理和分离等。SaaS应用的分布式数据存储和訪问往往不能简单的採用已有的一些开源分布式系统,或者一些开源的分布式数据库系统。由于在大型的SaaS应用中,数据的切割(分布的基础)往往也不能做到单一,而数据的切割又会影响数据訪问的路由策略。这就导致通用型的做法不太适合详细的需求。

SaaS的这样的基础实际上就已经非常具有技术含量了,而SaaS业务应用本身,在逻辑上就更难了。并非訪问数据库加上一个隔离字段那么简单。

一般SaaS系统除了主要的多用户租赁(注意,设计SaaS的时候一定要以软隔离为基础。这样能够做到最大化的自由,并且不会影响数据库隔离和数据库实例隔离的需求 )还会牵扯到在线许可,多时区,多语言,以及功能、页面、流程的可配置。特别是更深层次的应用更会涉及到在线跨企业资源共享和流程协作的问题,处理这类问题会非常棘手。

特别是SaaS在线企业级应用,你须要面对的问题会更加复杂(业务规则的分与合)。

假设在做架构的时候。假设没有考虑到这些问题,后面的噩梦会非常多。

甚至你可能玩不转。

SaaS应用事实上并不简单,哪怕就是一个CRM在线应用。也是非常具有业务和技术含量的。依据我的分析,纷享销客和销售易尽管融了不少的资。但他们的系统架构还算不上真正意义下的云计算模式下的SaaS。金蝶,用友。速达的在线应用尽管没有深入研究,但通过他们用户的一些反馈,我感觉60%的可能性是伪云计算SaaS应用。当然。假设知道内幕的,能够告诉我。

SaaS企业应用涉及的点非常多。并且非常多点之间是有关联的,因此你必须在这些问题点的处理中不断地进行平衡,进行取舍。比方,採用面向服务(SOA)的架构,在一定程度上是能够降低一些复杂性,但这样一来也降低了应用系统的总体性,SOA的粒度和边界的划分就是非常重要的权衡点。

在进行企业SaaS应用架构的时候,最好先弄清下面几个点:
1) 数据隔离和数据分布的路由策略。
2) 须要做哪些业务,是否须要做用户间进行资源共享和流程协作;
3) 假设须要资源共享和协作。那么这个过程中的用户数据归属问题。
4) 企业数据的规范性和统一性问题(这会涉及到參照,统计等兴许一系列问题点);

......

非常多企业喜欢利用面试的方式来偷师,用处事实上并非非常大,SaaS应用的单个问题点都并非非常复杂,关键在于这些点放到一起的时候。你怎样依据你自己的业务进行取舍才是关键,而这样的东西。靠拉再多的人来面试都是解决不了问题的。原因非常easy:不懂的人跟你讲。你会被误导,而真正懂的人给你讲的也未必适合于你的应用。假设你结合你的问题去问别人,别人也未必是hellokitty。




浅谈SaaS应用开发的难度的更多相关文章

  1. 浅谈iOS视频开发

     浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...

  2. 浅谈Android样式开发之布局优化

    引言 今天我们来谈一下Android中布局优化常用的一些手段.官方给出了3种优化方案,分别是</include>.</viewstub>.</merge>标签,下面 ...

  3. 浅谈移动Web开发(上):深入概念

    PPI 什么是PPI PPI的复杂之处在于如果他所属的上下文环境不同,意义也会完全不一样. 当我们在谈论显示设备的PPI时,它代指的屏幕的像素密度:当我们在谈论和图片相关时,我们谈论的是打印时的分辨率 ...

  4. 浅谈Bluetooth蓝牙开发

    前言:项目用到蓝牙开发,具体蓝牙获取硬件传感器中的数据. 因为没有蓝牙开发的相关经验,决定先了解一些蓝牙开发的知识,再去看之前同事写的蓝牙相关代码. ------------------------- ...

  5. 浅谈 Linux 内核开发之网络设备驱动

    转自http://www.ibm.com/developerworks/cn/linux/l-cn-networkdriver/ 网络设备介绍 网络设备是计算机体系结构中必不可少的一部分,处理器如果想 ...

  6. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  7. 浅谈web前端开发阅历

    WEB前端研发工程师,在国内算是一个朝阳职业,这个领域没有学校的正轨教育,大多数人都是靠本人自学成才.本文次要引见本人从事web开发以来(从大二至今)看过的书籍和本人的成长过程,目的是给想了解Java ...

  8. NIO原理剖析与Netty初步----浅谈高性能服务器开发(一)

    除特别注明外,本站所有文章均为原创,转载请注明地址 在博主不长的工作经历中,NIO用的并不多,由于使用原生的Java NIO编程的复杂性,大多数时候我们会选择Netty,mina等开源框架,但理解NI ...

  9. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

随机推荐

  1. c/c++中sleep()函数毫秒级的实现

    近期看到好多人在问.c/c++中的sleep函数是秒级的,能不能实现毫秒级的呢?当然非常easy.我的写法例如以下 #include <stdio.h> #include <sys/ ...

  2. hdu 4603 Color the Tree

    这道题细节真的非常多 首先能够想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占据和这个点邻接的边 所以,解决这道题的过程例如以下: 预处理阶段: step 1:取随意一个 ...

  3. [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)

    题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...

  4. 30.QT IDE编写

    mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTe ...

  5. python中struct模块

    # #********struct模块********# # 1.按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时, # 不能传输int,此时先将int转化为字节流,然后再发 ...

  6. 关于getchar()的使用

    '\n'表示换行.如果用键盘敲一下回车键的话,getchar会返回一个换行符.!='\n'意思是不等于换行符.ch应该是前边定义的一个char型变量, getchar()是一个从缓冲区获取字符的函数, ...

  7. rel= "noopener"

    rel= "noopener" <a href= "https://www.xiaogezi.cn/" target= "_blank" ...

  8. null和undifned的区别

    null和undifned的区别 1 从类型方面:null的类型是对象,undified的类型是undified. 2 从定义方面:null是一个表示"无"的对象,转为数值时为0: ...

  9. MeayunDB-高性能分布式内存数据库

    MeayunDB(www.meayun.com)是一款分布式的NoSQL列式内存数据库,由C#编写,主要为高性能,高并发,高可伸缩及大数据系统提供技术解决方案.基于MeayunDB,可以简单,快速的构 ...

  10. TensorFlow初学

    TensorFlow初学 基本概念 1.激活函数和成本函数 激活函数(activation function):一般是非线性函数,就是每个神经元通过这个函数将原有的来自其他神经的输入做一个非线性变化, ...