在云计算方面,Salesforce 可谓是业界的领袖,它不仅在产品方面比较成熟,而且在思维方
面也是引领潮流的,特别是在SaaS 和PaaS 这两个领域内。
Salesforce 的整体架构
Force.com 是Salesforce 整体架构的核心,因为它首先整合和控制了
底层的物理基础设施,接着给上层的Sales Cloud、Service Cloud、Chatter 和基于Force.com 的
定制应用提供PaaS 服务,最后那些Force.com 上层的应用以SaaS 的形式供用户使用。这样做
的好处主要有两方面:其一是关于成本的,因为通过这个统一的架构能极大地整合多种应用,
从而降低了在基础设施方面的投入;其二是在软件架构方面,因为使用这个统一的架构可以使
所有上层的SaaS 服务都依赖Force.com 的API,这样将有效地确保API 的稳定性并避免了重
复,从而方便了用户和Salesforce 在这个平台上开发应用。
Force.com 是Salesforce 在2007 年推出的业界第一个PaaS 平台,并且已经有超过47 000
个企业使用了这个平台。Force.com 基于多租户架构,主要通过提供完善的开发环境等来帮助
企业和第三方供应商交付健壮的、可靠的、可伸缩的在线应用。
Force.com 主要有5 方面的功能。
强大的定制功能。在Force.com 中,不仅能够定制UI(User Interface,用户界面),而
且也能定制Workflow 和表格等。
提供完善的开发环境。首先,通过Visualforce 工具能方便地使用拖曳来设计页面。其次,
Salesforce 提供了基于Eclipse 的IDE 来快速开发应用。最后,Salesforce 还提供一个沙
盒来方便用户测试。
支持复杂的事务和流程。通过Force.com 专属的Apex 语言,能方便地设计和开发复杂
的事务和流程。
优秀的整合功能。用户除了可以在AppExchange 购买其所需的功能和应用外,还可以通
过Force.com 的Web 服务接口来和其他应用整合,比如SAP 等。
久经考验的基础设施。由于Salesforce 除了通过在多个大洲建有数据中心来应对灾难的
发生,而且在可用性和安全性等方面也有一定积累,所以Salesforce 能长时间支持众多
服务的正常运行。
多租户的介绍
多租户指的就是一个单独的软件实例可以为多个组织服务。一个支持多租户的
软件需要在设计上能对它的数据和配置信息进行虚拟分区,从而使得每个使用这个软件的组织
都能用到一个单独的虚拟实例,并且可以对这个虚拟实例进行进一步的定制。但是要让一个软
件支持多租户并非易事,因为不仅要对它的软件架构进行相应的修改,而且要对它的数据库结
构进行特殊设计,同时在安全和隔离性方面也要有所保障。
1. 多租户和多用户的区别
多用户的关键在于不同的用户拥有不同的访问权限,但是多个用户共享同一个实例。而在
多租户中,多个组织使用的实例就算是同一个,也会存在一定的差异。
2. 多租户和虚拟化的区别
多租户和虚拟化在概念上比较类似,都是给每个用户一个虚拟的实例,并且都支持定制化,
但是它们作用的层次不同,虚拟化主要是虚拟出一个操作系统的实例,而多租户则主要是虚拟
出一个应用的实例。
多租户技术的优缺点
1. 多租户技术的优点
在优点方面,多租户技术主要在下面这3 个方面具有一定的优势。
经济。因为一个软件实例能被多个组织共享,所以降低了整体资源的消耗,也同时降低
了应用运行的成本和相应的管理开支。
易于更新和开发。因为所有组织都共享同一套核心代码,所以能够让软件更新和开发更
简单。
管理方便。首先,使用多租户架构能减少物理资源和软件资源,这将简化管理。其次,
由于多租户软件主要由有经验的云供应商运营,所以能依赖那些非常有经验的管理人员
来提升效率。
2. 多租户技术的不足之处
和其他技术一样,多租户技术也有一些不尽如人意的地方,具体如下所示。
技术复杂。一个软件需要作大量修改才能支持多租户架构,而且这种修改往往会增加整
个软件在架构方面的复杂性。
不够安全。因为众多组织的应用和数据共享了同一套软件和基础设施,所以如果出现机
器宕机、软件出现问题或者大规模的数据被暴露等情况,将会造成更严重的后果。
常见的多租户模型
在现有的实现中,主要有3 种常见的多租户模型,它们之间的区别主要在于其底层采用的
数据库模式。
1. 私有表
它是最简单的扩展模式,就是为每个租户的自定义数据创建一个新表。优点是简单。缺
点是涉及高成本的DDL(Data Definition Language,数据定义语句)操作,并且它的整合度
不高。
2. 扩展表
总体而言,扩展表比较类似于私有表,但是一个扩展表会被多个租户共享,所以无论是共
享表还是基本表都会有租户栏位。扩展表比私有表有更高的整合度和更少的DDL 操作,但是
在架构上比私有表更复杂。
3. 通用表
通用表主要用来存放所有自定义信息,里面有租户栏位和许许多多统一的数据栏位(比如
500 个)。这种统一的数据栏位会使用非常灵活的格式转储各种类型的数据,比如Varchar。由
于每一行中的数据栏位都会以一个键、一个值的形式存放所有自定义数据,这样通用表的行都
会很宽,而且会出现很多空值,所以通用表这种方式也被称为稀疏列。其好处是具有极高的整
合度并避免了DDL 操作,但是在整体实现方面难度加大。
总体架构
首先,最前面是网关,它将接受所有访问Force.com 的请求,无论它是访问Sales Cloud,
还是关于第三方定制程序的。接下来,网关会根据这个请求所属的租户把请求转发给对应的
POD。那么什么是POD 呢?简单地来说,POD 就是一组集群服务器,每个POD 都运行一整
套Force.com 系统,而且每个POD 支持成千上万个租户。Salesforce 现有10 多个POD 来支撑
它所有服务的运营,并把所有租户平衡地分配给每个POD,而且主要通过建立新的POD 来支
撑新的租户。当POD 收到请求之后,它会先通过其内置的负载均衡器来将请求转发给负载略
轻的应用服务器。为了简化架构和方便伸缩,应用服务器是无状态的,而且在一个POD 内会
有多个应用服务器以应对大规模的请求。最后,当应用服务器在处理请求的时候,如果发现请
求所需的数据没有被缓存的话,应用服务器会调用这个租户所属的共享数据库来取得相关数
据。虽然共享数据库是使用成熟的Oracle 数据库产品,但是在数据库表的设计上为多租户作
了很多优化工作。
元数据驱动
首先,Force.com 的元数据基于大家非常熟悉的面向对象的概念,所以也可以认为元数据
是对象。也就是说,Force.com 是由一个个对象组装而成的,而且Force.com 中的对象可以是表
格,也可以是UI,甚至可以是用户权限等。一个Force.com 的对象和这个对象下面的字段可以
对应一个数据库的表和这个表的列,而且Force.com 对象之间的关系在功能上类似于数据库的
引用完整性约束。但与数据库中每个数据库表都对应于独立的存储地址不同的是,Force.com
使用几个共享的大数据库表来作为堆存储来放置所有对象,而这些存储元数据的表也被称为
UDD(Universal Data Dictionary,通用数据字典)。
接着,是关于应用的。一个在Force.com 上运行的应用实例是通过组合许许多多个对象来
生成的,也可以说一个应用实例是使用元数据来描述的。比如在应用初始的时候,每个客户都
使用同一个版本和同样规模的对象,而且用户通过添加和更新对象来定制应用,比如增加新的
UI 和字段等,同时系统会对共享的和定制的对象进行严格分离,这样既能非常方便地更新共享
代码,也能保证某个用户定制过的部分不会影响到其他用户。在实现上,Force.com 实际上并
没有为一个新对象生成一个数据库表,而是以元数据的形式存储在几张大表中。在运行时,
Force.com 使用一整套引擎分析数据库中的元数据来动态生成一个虚拟应用实例和这个应用所
需的模块,比如公共UI、定制UI 和其他对象等。
还有,虽然元数据驱动这种和Java 很类似的动态生成机制在速度上有天生缺陷,但是
Force.com 也内置有与Sun 的Hotspot 技术有异曲同工之妙的元数据缓存来加速常用元数据的
读取。
应用服务器
元数据缓存。用于存放那些最近用到的和比较常用的元数据,加速应用的生成。
大规模数据处理引擎。主要用来加速处理大量的数据读写和在线事务。
多租户感知的查询优化引擎。这个引擎将通过维护多租户的信息来帮助Oracle 自带的
基于成本的查询优化器更好地适应多租户环境。
运行时应用生成器。这个生成器主要根据用户的请求来动态生成应用,并且利用上面提
到的查询优化引擎来提升效率。
全文检索引擎。在数据库对数据进行更新的同时,这个引擎会异步更新这个数据的相关
索引。