漫谈SaaS开发

王:嗨,老谭,这么巧,居然在湛江见面了。继续上次的话题吧,我可惦记着呢!上次是站在用户的角度,我们聊到了SaaS是有必要的。这次该从我们软件开发者的角度,谈谈怎么开发SaaS了。

一、SaaS应用最突出的特征是什么?

老谭:好啊!SaaS也是一种应用。还是你先说说看,你认为,SaaS的开发,和普通软件的开发有什么不同。

小王:我上次都说过了,闹不清楚SaaS究竟有什么特别的。研发过程还是那些过程,技术还是那些技术。无非现在可以用一些新的技术,如微服务,持续交付什么的。哦,对了,在云上,高可用性,就是HA一类的事情,云也帮我搞定了。

老谭:你说的都对,这些新技术对SaaS的开发会很有帮助。但SaaS最突出的特性不在这里。我们考虑一下场景。你开发了一个SaaS应用,自己服务运维,多个客户上来订阅。这意味着什么?

小王:这意味着……我这一套软件,要同时服务多个客户。

老谭:对头,同时服务于多个客户。我们把名字规范一下。软件是你运营的,客户订阅后上来使用,相当于租用你的软件,所以这些客户严格说来是租户。SaaS软件要同时服务于多个租户。这个特性,叫做多租户。

小王:多租户?

老谭:是的,多租户。支持多租户,是SaaS应用的最突出的特征。

二、何谓多租户?

小王:“多租户是SaaS的最突出特征”,您这把多租户抬得够高的。

老谭:如果谈应用的功能、性能之类的,自有其他关注点。我们这不是在说SaaS吗?关于多租户在SaaS中的定位,看看业界都是怎么说的:

多租户是 SaaS 供应商获得成功的关键因素。

如果没有多租户的话,SaaS 不可能取得成功。

在 SaaS 这场竞赛中,多租户就是赢得这场胜利的筹码。

……

所以,我那么说,还真没抬高多租户在SaaS中的重要性。

小王:还真是。那究竟什么是多租户呢?一个租户,就相当于使用我这SaaS软件的一个企业。支持多租户,就是支持多个租户同时使用我这SaaS软件。是这个意思吧?

老谭:是这个意思。就像我们上次聊的,SaaS软件的拥有者、运营者、维护者,都不再是租户了。租户只要订购并使用就可以了。当然,租户用了软件,还得付钱。

三、怎么才能支持多租户?

小王:这和我熟悉的软件,区别确实不小。我怎么才能让我的软件支持多租户呢?

老谭:支持多租户,是一个系统工程,需要多方面的支撑。IBM将这些方面做了总结,我觉得可以借鉴:

应用程序必须支持多租户

应用程序必须具备自助注册功能。

必须具备订阅/记账机制。

应用程序必须能够有效地扩展。

必须能够监视、配置和管理应用程序和租户。

必须有一种机制能够支持惟一的用户标识和身份验证。

必须有一种机制能够支持对每个租户进行自定义。

小王:啊~这么多啊?

老谭:SaaS要考虑的因素,确实比传统应用要多。好在,上面这七条,并不是每一条都需要应用程序自己去处理。SaaS应用的运行、维护,都要基于一个云平台。上面大部分工作,可以交给云平台去处理。

小王:您上次提到的ProMACE平台,就是这样的云平台。是吧?

老谭:是的。实际上,ProMACE平台可以处理上面第二到第七条的绝大部分内容。对我们这些SaaS应用的开发者而言,主要关注上面的第一条就可以了,也就是让应用程序支持多租户。

小王:那敢情好。我的应用程序,怎么才算做到了多租户呢?

老谭:要是能做到下面的三点,就基本上可以了。第一,多租户高效性,第二,可配置,第三,可缩放。

小王:我看下。多租户高效性,不明白。可配置,有印象。可缩放,指的是scalable吧?

老谭:对,可缩放就是你说的scalable,应用要能够适应租户规模的变化,根据压力的大小自动增加或减少所使用的资源。这一点,也是由云平台保障的。

四、如何实现多租户高效性

小王:看来云平台,也就是我们的ProMACE平台,真是个好东西啊!我们回过头来看另外两个要求。先看第一个吧,什么叫多租户高效性啊?

老谭:先举一个你熟悉的编程的例子,看看低效率是什么情况。比如拿到了一批员工的工号,要查询这些员工的信息,而信息保存在数据库里。你会怎么做呢?

小王:那还不简单。把这一批员工的工号,做成一个集合参数,向数据库发起一次查询就行了。

老谭:没错。可是,有人的做法不一样:他每次访问数据库只给一个工号,只查这一个员工的信息。有几个员工,就向数据库发起几次查询。

小王:他傻呀?那得多慢啊!查10个员工的,访问10次数据库,查1 000个员工的,就要访问1 000次数据库。这效率,谁受得了?

老谭:这就叫低效。多租户高效性和查询高效性的要求是类似的。服务一个租户要一套资源,你不能搞得,服务1 000个租户,就要1 000套资源。

小王:支持的租户多了,需要的资源就多。但不至于每多一个租户,就多需要一套资源吧?

老谭:这涉及到多租户的实现方式。有两种,分别是逻辑多租户和物理多租户。

小王:逻辑?物理?

老谭:多租户要达到的效果,是租户之间相互隔离,你不知道我在用,我也不知道你在用。隔离的方法就分为逻辑的和物理的。所谓逻辑的,就是不同的租户用的还是一套应用,硬件、数据库、应用服务,都是共用一套。应用自己实现了租户之间的隔离,所以叫逻辑多租户。物理多租户中,不同的租户使用的资源就是不同的,为每个租户分配了独占的硬件资源、数据库、应用服务。黄总将其称为大通铺模式和单间模式,很形象吧?

小王:明白了。那就是说,物理多租户不满足多租户高效性的要求。我要搞SaaS,就得实现逻辑多租户。既然物理多租户不满足多租户高效性的要求,为什么会有人考虑它呢?

老谭:这是权宜之计。一些已有的应用,本来就是为单个租户服务的。现在要上云,以SaaS的方式服务于多个租户。改造成逻辑多租户的成本高、时间长,所以先以物理多租户的形态运行。

小王:我要开发新的SaaS,肯定要考虑逻辑多租户的,是吧?逻辑多租户要实现租户之间的逻辑隔离。我觉得这个倒不难,只要在数据上都加上一个租户属性就可以了。

老谭:确实是这样。在建模时,只要是和租户有关的数据,都要加上租户这个属性。

五、如何实现可配置?

小王:第二个要求是可配置。我现在开发的应用也要求可配置啊,比如换肤、权限,等等。SaaS的可配置有什么不同吗?

老谭:SaaS对可配置性的要求,比传统应用的要高得多。传统应用所要求的可配置能力,指的是在一个组织内部不同用户的配置要求。这个要求,SaaS中也要保留。SaaS的复杂性在于,针对租户的可配置要求。一个应用要面对不同的租户,也就是不同的企业,每个企业都会有自己的需求,也就导致众口难调。可是,众口难调也得调。

小王:针对租户的可配置性,都体现在什么地方呢?

老谭:主要体现在三个层面:界面可配置性、功能可配置性、模型可配置性。

小王:这又是一套一套的。界面可配置性,我理解,也做过。另外两个是什么意思啊?

老谭:功能可配置性,指的是不同租户对功能的要求是不一样的。例如,有两个租户A、B,有十个功能F1到F10,租户A、B都需要的功能是F1到F5,租户A单独需要的功能是F6、7,租户B单独需要的功能是F8、9、10。

小王:我们过去做的应用,和这个场景有点像,只是要把租户换成用户。就是说,用户A可以使用F1-5,还有F6-7;用户B可以使用F1-5,还有F8-10。

老谭:那是授权的问题,和这个例子不完全一样。在这个例子里面,租户A可以给自己的用户授权,范围只能在F1-7。租户B可以给自己的用户授权,但范围是F1-5, 8-10。

小王:看来不能套用原来的授权机制。应该怎么处理呢?

老谭:首先,要把功能定义好,如这里的F1-10。其次,要支持用户订购不同的功能组合。因为以后要按照所订购的功能收费。另外,为了方便用户订购,要把功能打包,批量订购。

小王:功能定义、打包,是应用开发的事情。订购应用内部的功能包,需要平台来做吧?

老谭:是的。但是这个功能,ProMACE似乎还没做。以后应该会做起来。

小王:呃。模型配置,指的是什么呢?

老谭:在同一项功能中,用户所处理的业务对象,可能不完全一样。

小王:例如?

老谭:以客户关系管理为例吧。每个租户要管理的客户的信息,有共性的内容,如姓名、电话、生日什么的。但有的租户需要管理的信息就是不一样,比如客户的来源,比如客户的家乡,比如结婚纪念日,等等。

小王:那就给他们都统一呗。取所有租户的并集,建成一个大表。

老谭:这也是一个方法。但是比较浪费空间。更严重的问题是,用户需要维护的信息很难预测,现在做了一个大宽表,我们承受了空间浪费的代价,但如果以后用户又要求添加新的属性,就难办了。

小王:类似的问题我们遇到过。有两个方法,一是预留字段,二是动态维护表结构。

老谭:预留字段,总是有上限。动态维护表结构,一般不建议:在程序运行阶段,要尽量避免使用DDL。Salesforce的方法倒是可以参考。

小王:Saleforce是做SaaS最厉害的那家吧?他们用什么方法?

老谭:它采用所谓的“元数据驱动”方法。

小王:元数据驱动?名字听起来很高大上。什么意思啊?

老谭:就相当于我们用过的列转行。首先,所有租户的字段,在一个表中统一管理。其次,为租户专门配置的字段,不是在这个表的某个列上,而是每需要一个字段,就在这个表中添加一行。

小王:噢,元数据,我想起来了,就像Oracle数据库的元数据,我们表中的每一列,在Oracle的元数据表中就会多出一行。

老谭:是这个意思。Salesforce借用了关系数据库管理元数据的方法,来管理租户的业务数据。实际上,当表的结构是动态的时候,就非常适合用这种元数据驱动的方法。

六、结束语

小王:看起来,实现SaaS,支持多租户,还是挺复杂的。

老谭:确实是这样的。和传统应用相比,SaaS要面临不同的应用场景,所以实现起来较为复杂。而且,我们这两天谈论的都是偏向概念性的内容,真正实现起来,肯定会有更多具体的问题要解决。

小王:有点怕怕……

老谭:担心是没有帮助的。挑战来了,我们还得勇于面对。好在有ProMACE平台的支持,很多共性的内容,可以交给平台去处理。应用和平台相互促进。

小王:那就拜托平台了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181202G19IBD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券