:::: MENU ::::

TalkingData's Blog

现在开始,用数据说话。

锐眼洞察 | Salesforce的二次开发平台的多租户架构(翻译)

Data, Tech

锐眼洞察 | Salesforce的二次开发平台的多租户架构(翻译)

原文:The Force.com Multitenant Architecture

译者:TalkingData研发副总裁 孔元明

本译文禁止商用,转载请注明来源与译者!

译者点评:

Force.com是十分优秀的多租户二次开发平台,本文详细讲述了它的高层设计。有很强的参考意义,但不建议简单模仿。

概要

Force.com是今天的卓越的按需应用程序开发平台,支持大约47,000多个组织。 企业和商业SaaS供应商都相信该平台能够提供健壮,可靠的互联网级应用程序。 为了满足其庞大用户群的极端需求,Force.com的基础是支持多租户应用的元数据驱动的软件架构。 本文解释了使Force.com平台快速,可扩展且安全的专利技术,适用于任何类型的应用程序。

介绍

历史表明,每隔一段时间,技术的不断进步和商业模式的变化就会在软件应用程序的设计,构建和交付给最终用户的方式上产生重大的范式转变。个人计算机(PC),计算机网络和图形用户界面(UI)的发明使得客户机/服务器应用程序替换昂贵的,不灵活的字符模式大型机应用程序成为可能。而今天,可靠的宽带互联网接入,面向服务的体系结构(SOA)以及管理专用本地应用程序的成本效率低下正在推动向可交付,可管理,共享的基于Web的服务(称为SaaS)。随着每一个模式的转变都带来了一系列新的技术挑战,SaaS也不例外。然而,现有的应用程序框架并不是为满足SaaS的特殊需求而设计的。这种空白导致了另一种新的范式转变,即平台即服务(PaaS)。托管应用程序平台是专为满足构建SaaS应用程序的独特挑战而设计的托管环境,并比以往更具成本效益。

本文的重点是多租户,这是一个基本的设计方法,可以显着帮助提高SaaS应用程序的可管理性。 本文定义了多租户,解释了多租户的优势,并说明了为什么元数据驱动架构是实现多租户的首要选择。 在这些大致介绍之后,本文的大部分内容解释了Force.com的技术设计,这是世界上第一个为互联网级应用程序提供交钥匙多服务的PaaS。 本文详细介绍了Force.com的专利元数据驱动架构组件,以便了解用于提供可靠,安全和可扩展的多租户应用程序的功能。

多租户应用

为了降低向多个不同的用户提供相同的应用程序的实施成本,越来越多的应用程序是多租户的,而不是单租户。 传统的单租户应用需要专门的资源来满足一个组织的需求,而多租户应用则可以满足多个租户(公司或公司内部的部门等)而只需要管理一个软件实例所需的硬件资源和人员的需求(图1)。

p1.png

多租户是一种向应用程序提供商和用户带来巨大收益的架构方法。 仅为多个组织运行一个应用程序实例会为提供商带来巨大的规模经济效益。 只需要一套硬件资源来满足所有用户的需求,一个经验丰富的管理人员就可以高效地管理一堆软硬件,开发人员只需在一个平台(操作系统,数据库等)上构建和支持一个代码库而不是许多平台。 多租户的经济性使应用程序提供商能够以较低的成本向客户提供服务。 每个参与的人都赢了。

多租户的一些有趣的优点是提高了质量,用户满意度和客户保留率。 与单租户应用程序(应用程序提供商无法使用的孤立孤岛)不同,多租户应用程序是由供应商自己托管的一个大型社区。 这种设计转变使供应商可以从集体用户群体(查询响应缓慢,发生什么错误等)收集操作信息,并对服务进行频繁,渐进式的改进,从而使整个用户群体受益匪浅。

多租户基于平台的方法的另外两个好处是协作和集成。 由于所有用户都在一个空间中运行所有应用程序,因此任何应用程序的任何用户都可以轻松访问特定的数据集。 此功能大大简化了集成相关应用程序及其管理的数据所需的工作。

比较原始云计算和PaaS

原始计算云是以机器为中心的服务,为应用程序的部署按需提供IaaS。 这样的云只提供了执行应用程序的虚拟服务器所需的计算能力和存储容量。 一些寻求快速上市策略的SaaS供应商避免了开发真正的多租户解决方案以及选择通过IaaS交付单租户实例的挑战。

像Force.com这样的平台即服务(PaaS)是一种以应用程序为中心的方法,它将服务器的概念完全抽象出来。 PaaS让开发人员从一开始就专注于核心应用程序开发,并通过按钮来部署应用程序。 提供商从不需要担心多租户,高可用性,负载平衡,可扩展性,系统备份,操作系统补丁和安全性以及其他类似的基础设施相关问题,所有这些服务都以PaaS中的“S”形式提供。

元数据驱动的架构

只有当它支持可靠,可定制,可升级,安全和快速的应用程序时,多租户才是实用的。 但是,多租户应用程序如何允许每个租户为标准数据对象和全新的自定义数据对象创建自定义扩展? 租户特定数据如何在共享数据库中保持安全,保证一个租户不能看到另一个租户的数据? 一个租户如何实时定制应用程序的界面和业务逻辑,而不影响所有其他租户的应用程序的功能或可用性? 如何修补或升级应用程序的代码库而不破坏特定于租户的定制? 随着成千上万的租户订阅服务,应用程序的响应时间如何呢?

创建静态编译的应用程序可执行文件是很难满足多租户的这些独特挑战。 本质上,多租户应用程序必须是动态的,或多态的,以满足各种租户和用户的个人期望。

由于这些原因,多租户应用程序设计已经发展到使用运行时引擎从元数据(应用程序本身的数据)生成应用程序组件 。 在一个定义良好的元数据驱动架构(图2)中,编译后的运行时引擎(内核),应用程序数据,描述应用程序基本功能的元数据,每个租户数据和定制化表的元数据,这四者之间有清晰的边界。 这些独特的边界使独立更新系统内核,独立修改核心应用程序,独立定制特定于租户的组件成为可能,而几乎不存在影响其他组件的风险。

p2.png

新的挑战和新的解决方案

尝试在应用程序的核心逻辑及其底层基础架构中编织多租户是一项复杂的任务。 从零开始构建元数据驱动的多租户应用程序,没有任何先前的经验,注定是一个耗时且易出错的工作。 最终,许多想成为SaaS的提供商将难以成功地构建多租户应用程序,并最终浪费宝贵的时间,而这些宝贵的时间本可以用在核心应用程序功能和特性的创新上。

一个问题是,传统的应用程序开发框架和平台没有适应现代Internet应用程序的特殊需求。 因此,新类型的平台正在形成,以帮助简化多租户应用程序的开发和部署。

Force.com是当今第一个也是最成熟的通用多租户互联网应用开发平台。 本文的其余部分解释了有关Force.com技术设计的具体细节,以便您更好地了解其功能。

Force.com平台体系结构概述

Force.com优化的元数据驱动架构可为按需多租户应用程序提供出色的性能,可扩展性和定制性(图3)。

p3.png

在Force.com中,暴露给开发人员和应用程序用户的所有内容均在内部表示为元数据。表单,报表,工作流程,用户访问权限,特定于租户的自定义和业务逻辑,甚至是底层数据表和索引的定义,都是抽象结构,仅仅作为Force.com的通用数据字典(UDD)中的元数据存在。 例如,当一个开发人员构建一个新的自定义应用程序并定义一个自定义表格,编写一个表单或编写一些程序代码时,Force.com不会在数据库中创建“实际”表格或编译任何代码。 相反,Force.com只是存储元数据,平台引擎可用这些元数据在运行时生成“虚拟”应用程序组件。 当有人想要修改或自定义应用程序的某些内容时,只需对相应的元数据进行简单的非阻塞更新即可。

由于元数据是Force.com应用程序的关键组成部分,因此平台的运行时引擎必须优化对元数据的访问; 否则,频繁的元数据访问会阻止平台扩展。 考虑到这个潜在的瓶颈,Force.com使用元数据高速缓存来维护内存中最近使用的元数据,避免性能降低磁盘I / O和代码重新编译,并改善应用程序响应时间。

Force.com将所有虚拟表的应用程序数据存储在几个用作堆存储的大型数据库表中。 然后平台的引擎通过考虑相应的元数据在运行时实现虚拟表数据。

为了优化对系统大型表中数据的访问,Force.com的引擎依赖于一组专门的数据透视表,这些数据透视表维护了非范式化的数据用于不同的目的,如索引,唯一性,关系等。

Force.com的数据处理引擎通过批量透明地执行数据修改操作,有助于简化大型数据加载和联机事务处理应用程序的开销。 该引擎具有内置的故障恢复机制,可以在找出导致错误的记录之后自动重试批量保存操作。

为了进一步优化应用程序响应时间,该平台采用了一种外部搜索服务,可以优化全文索引和搜索。 随着应用程序更新数据,搜索服务的后台进程几乎实时地异步更新租户和用户特定的索引。 应用程序引擎和搜索服务之间的职责分离使平台应用程序能够高效地处理事务处理,而无需文本索引更新的开销,同时快速为用户提供准确的搜索结果。

由于Force.com的运行时应用程序生成器动态构建应用程序以响应特定的用户请求,因此引擎严重依赖于其“多租户感知”查询优化器来尽可能高效地执行内部操作。 查询优化器考虑哪个用户正在执行给定的应用程序功能,然后使用UDD中维护的相关租户特定元数据以及内部系统数据透视表,构建并执行数据访问操作作为优化的数据库查询。

现在您已经对构成Force.com基础机制的关键体系结构组件有了一个大概的概念,下面的章节更详细地解释了各种内部系统元素的结构和目的。

Force.com数据定义和存储

Force.com存储模型并不是试图代表每个应用程序和租户来管理大量的,不断变化的实际数据库结构,而是使用一组元数据,数据和数据透视表来管理“虚拟”数据库结构,如图4。

p4.png

当组织创建自定义应用程序对象(即自定义表)时,UDD会跟踪有关对象,其字段,关系和其他对象定义特征的元数据。 同时,一些大型数据库表存储所有虚拟表的结构化和非结构化数据,一组相关的专用数据透视表维护非范式化的数据,使组合的数据集非常有用。

图5是三种核心Force.com元数据和数据结构的简化实体关系(ER)图,这些元数据和数据结构实现了这种方法:对象,字段和数据表。

注:为了简明扼要,Force.com系统表和列的实际名称没有在本文中引用。

Objects Metadata Table:

Objects Metadata Table存储组织为应用程序定义的自定义对象(又名表或实体)的信息,包括对象(ObjID)的唯一标识符,拥有该对象的组织(OrgID)以及给予该对象的名字(ObjName)。

Fields Metadata Table:

Fields Metadata Table存储组织为自定义对象定义的自定义字段(又名列或属性)的信息,包括字段的唯一标识符(FieldID),拥有该包含对象的组织(OrgID),包含 字段(FieldName),字段的数据类型,指示字段是否需要索引(IsIndexed)的布尔值,以及对象中的字段相对于其他字段(FieldNum)的位置。

p5.png

Data Table:

数据表存储映射到所有自定义对象及其字段的应用程序可访问数据,如对象和字段中的元数据所定义。 每行包括标识字段,如全球唯一标识符(GUID),拥有该行(OrgID)的组织和包含对象标识符(ObjID)。 数据表中的每一行还有一个名称字段,用于存储相应对象实例的“自然名称”; 例如,一个Account对象可能使用“Account Name”,Case对象可能使用“Case Number”,等等。 Value0 … Value500列存储映射到Objects和Fields表中声明的对象和字段的应用程序数据; 所有“flex”列都使用可变长度字符串数据类型,以便可以存储任何结构化类型的应用程序数据(字符串,数字,日期等)。

自定义字段可以使用多种标准结构化数据类型中的任何一种,例如文本,数字,日期和日期/时间以及特殊用途的结构化数据类型,如选项列表(列举字段),自动编号(自动增量,系统生成的序列号) ,公式(只读派生值),主从关系(外键),复选框(布尔),电子邮件,URL等。 自定义字段也可以是必需的(非空),并具有自定义验证规则(例如,一个字段必须大于另一个字段),这两者都由平台的应用程序服务器强制执行。

当组织声明或修改自定义应用程序对象时,Force.com在定义该对象的Objects表中管理一行元数据。 同样,对于每个自定义字段,Force.com管理Fields表中的一行,包括将该字段映射到Data表中的特定Flex列以存储相应字段数据的元数据。 由于Force.com将对象和字段定义作为元数据而不是实际的数据库结构进行管理,因此平台可以容忍多租户应用程序模式维护活动,而不会阻塞其他租户和用户的并发活动。

同一对象的两个字段不能映射到Data表中的同一个Flex列(槽)进行存储; 然而,只要每个字段来自不同的对象,单个Flex列就可以管理多个字段的信息。

p6.png

如图6中Data表的简化表示所示,flex列是通用数据类型(可变长度字符串),它允许Force.com在一个flex列中使用多个不同结构化数据类型(字符串,数字 ,日期等)。

Force.com使用统一的规范格式存储所有Flex列数据,当应用程序从Flex列中读写数据时,根据需要使用基础数据库系统的数据类型转换函数来转换数据类型(例如TO_NUMBER,TO_DATE,TO_CHAR)。

尽管图5中未显示,但数据表还包含其他列。 例如,有四列来管理审计数据,包括何时和谁创建对象实例(行),以及何时和谁上次修改对象实例。 数据表还包含一个IsDeleted列。Force.com用来指示对象实例何时被删除。

Clobs Table:

Force.com支持将字段声明为字符大对象(CLOB),以允许存储长达32,000个字符的长文本字段。 对于具有CLOB的Data表中的每一行,Force.com都将CLOB存储在名为Clobs的数据透视表中,系统可以根据需要将其与Data表中的对应行进行连接。

注意:Force.com还将索引形式的CLOB存储在数据库外部以进行快速文本搜索。 有关Force.com文本搜索引擎的更多信息,请参阅第9节。

Indexes Pivot Table:

传统的数据库系统依靠索引来快速定位数据库表中具有匹配特定条件的字段的特定行。 但是,为Data表的flex列创建本地数据库索引是不现实的,因为Force.com可能使用单个flex列来存储具有不同结构化数据类型的多个字段的数据。 相反,Force.com通过将标记为索引的字段数据同步复制到名为Indexes的数据透视表中的相应列,来管理Data表的索引,如简化的ER图(图7)所示。

Indexes表包含强类型的索引列,如StringValue,NumValue和DateValue,Force.com用来定位相应数据类型的字段数据。 例如,Force.com会将数据表flex列中的字符串值复制到Indexes中的StringValue字段,DateValue字段的日期值等。Indexes表的基础索引是标准的非唯一数据库索引。 当内部系统查询包含引用自定义对象中的结构化字段的搜索参数时,平台的查询优化程序将使用索引表来帮助优化关联的数据访问操作。

p7.png

注意:Force.com可以处理跨多种语言的搜索,因为平台的应用程序服务器使用了一种将字符串值转换为通用的,不区分大小写的格式的大小写折叠算法。 Indexes表的StringValue列以这种格式存储字符串值。 在运行时,查询优化器会自动构建数据访问操作,以便优化的SQL语句过滤对应于搜索请求中提供的文字的相应大小写的StringValue。

UniqueFields Pivot Table:

Force.com允许组织指示对象中的字段何时必须包含唯一值(区分大小写或不区分大小写)。 考虑到数据表的安排以及自定义字段数据的值列的共享使用情况,为表创建唯一的数据库索引(类似于上一节讨论的非唯一索引的问题)是不实际的。

为了支持自定义字段的唯一性,Force.com使用名为UniqueFields的数据透视表; 除了UniqueFields表的底层数据库索引强制唯一性以外,此表与Indexes数据透视表非常相似。 当应用程序尝试将重复值插入到需要唯一性的字段中,或者管理员尝试在包含重复值的现有字段上强制执行唯一性时,Force.com会将相应的错误消息转发给应用程序。

Relationships Pivot Table:

Force.com提供了“关系”数据类型,组织可以用它来声明应用程序对象之间的关系(参照完整性)。 当组织使用关系类型声明对象的字段时,平台将该字段映射到数据表中的值字段,然后使用此字段存储相关对象的ObjID。

为了优化连接操作,Force.com维护一个名为Relationships的数据透视表,如图8所示。

p8.png

关系索引表具有两个底层数据库唯一的复合索引(OrgID + GUID和OrgID + ObjID + RelationI D + TargetObjID),可根据需要在任一方向进行高效的对象遍历。

FallbackIndex Table:

在极少数情况下,平台的外部搜索引擎可能变得过载或不可用,并且可能无法及时响应搜索请求。 平台的应用程序服务器并没有将一个令人失望的错误返回给请求搜索的用户,而是回退到二级搜索机制来提供合理的搜索结果。

回退搜索是作为直接数据库查询实现的,搜索条件引用了目标应用程序对象的名称字段。 要优化全局对象搜索(跨越对象的搜索),而不必执行潜在的昂贵的联合查询,Force.com将维护一个名为FallbackIndex的数据透视表,记录所有对象的名称。 事务修改对象对于Fallback Index的更新是同步发生的,所以回退搜索总是可以访问最新的数据库信息。

NameDenorm Table:

NameDenorm表是一个精简数据表,它存储数据表中每个对象实例的ObjID和Name。 当应用程序需要提供超链接到父/子关系中涉及的对象实例的列表时,Force.com使用NameDenorm表执行一个相对简单的查询,该查询检索每个引用的对象实例的名称作为超链接的一部分显示。

History Tracking Table:

Force.com可轻松为任何字段提供历史记录。 当组织为特定字段启用审计时,系统将使用内部数据透视表作为审计跟踪异步记录有关对字段所做更改的信息(旧值和新值,更改日期等)。

数据和元数据的分区:

所有Force.com数据,元数据和数据透视表结构(包括基础数据库索引)均由OrgID(租户)使用本机数据库分区机制进行物理分区。 数据分区是数据库系统提供的一种经过验证的技术,可将大型逻辑数据结构物理划分为更小,更易管理的部分。 分区还可以帮助提高大型数据库系统(如多租户环境)的性能,可伸缩性和可用性。 例如,根据定义,每个Force.com应用程序查询都以特定租户的信息为目标,因此查询优化器只需要考虑访问包含租户数据的数据分区,而不是整个表或索引,这种常见的优化有时被称为“ 分区修剪“。

应用程序开发,逻辑和处理

Force.com支持两种不同的方式来创建自定义应用程序及其各个组件:声明式地使用本地平台应用程序框架,并使用应用程序编程接口(API)以编程方式进行创建。 以下部分将更详细地介绍每种方法和相关的应用程序开发主题。

Application Framework:

开发人员可以使用“原生”Force.com应用程序框架声明性地构建自定义的Force.com应用程序。 该平台的本地点击式界面支持应用程序开发过程的所有方面,包括创建应用程序的数据模型(自定义对象及其字段,关系等),安全性和共享模型(用户,组织层次结构,配置文件 等),用户界面(屏幕布局,数据输入表格,报告等)以及逻辑和工作流程。

Force.com应用程序框架用户界面很容易构建,因为不需要编码。 在幕后,他们支持所有通常的数据访问操作,包括查询,插入,更新和删除。 本地平台应用程序执行的每个数据操作操作可以一次修改一个对象,并自动提交单独事务中的每个更改。

Force.com的本地集成开发环境(IDE)提供了对许多内置平台功能的轻松访问,从而可以轻松实现通用应用程序功能,而无需编写复杂且易于出错的代码。 这些功能包括声明式工作流程,加密/屏蔽字段,验证规则,公式字段,汇总摘要字段和交叉对象验证规则。

工作流是由插入或更新对象实例(行)触发的预定义操作。 工作流可以触发任务,电子邮件警报,更新数据字段或发送消息。 工作流规则指定确定何时触发工作流操作的条件。 可以将工作流程设置为立即触发,或设置为在触发事件之后的后续间隔内进行操作。 例如,开发人员可能会声明一个工作流,在更新记录后立即自动将该行的“状态”字段更新为“已修改”,然后将模板电子邮件警报发送给主管。 所有工作流程操作都发生在触发工作流程的事务上下文中。 如果系统回滚事务,则执行的所有相关工作流操作也会回滚。

为包含敏感数据的对象定义文本字段时,开发人员可以轻松配置该字段,以便Force.com加密相应的数据,并可选择使用输入掩码来隐藏屏幕信息。 Force.com使用AES(高级加密标准)算法128位密钥来加密字段。

声明式验证规则是组织无需任何编程即可执行域完整性规则的简单方法。 例如,图9中的第一个屏幕截图说明了使用Force.com IDE声明确保LineItem对象的Quantity字段总是大于零的验证规则是多么容易。

公式字段是Force.com应用程序框架的声明性功能,可以轻松地将计算的字段添加到对象。 例如,图9中的第二个屏幕截图也显示了开发人员如何使用一个简单的IDE窗体向LineItem对象添加一个字段来计算LineTotal值。

汇总摘要字段是一个跨对象字段,可以很容易地在父对象中聚合子字段信息。 例如,图9中的最终屏幕截图显示了如何使用IDE根据LineItem对象的LineTotal字段在SalesOrder对象中创建OrderTotal摘要字段。

注意:在内部,Force.com使用本地数据库功能实现公式和汇总摘要字段,并有效地重新计算值作为正在进行的事务的一部分。

p9.png

Metadata and Web Services APIs:

Force.com还为构建应用程序提供了编程API。 这些API与基于SOAP的开发环境(包括Visual Studio .NET(C#)和Apache Axis(Java和C ++))兼容。

应用程序可以利用Force.com API与其他环境集成。 例如,应用程序可以利用API来访问其他系统中的数据,构建混合来源于多个数据源的混搭,将外部系统作为应用程序进程的一部分,或者构建胖客户端以连接Force.com Platform数据库管理系统。

Force.com元数据API对管理应用程序组件非常有用 – 创建和修改与自定义对象定义,页面布局,工作流等相对应的元数据。创建,检索,更新或删除对象实例(数据行) ,应用程序可以使用Force.com Web服务API。

要访问Force.com Web服务,开发人员首先下载一个Web服务描述语言(WSDL)文件。 开发平台然后使用WSDL文件生成一个API来访问组织的相应Force.com Web服务(数据模型)。

有两种类型的Force.com WSDL文件。 企业WSDL文件适用于构建组织特定应用程序的开发人员。 企业WSDL文件是组织数据模型的强类型表示。 它向开发环境提供有关组织架构,数据类型和字段的信息,从而使其与Force.com Web服务之间的集成更紧密。 如果将自定义字段或自定义对象添加到组织的应用程序模式,或者从组织的应用程序模式中删除自定义对象,企业WSDL也会发生变化 相反,合作伙伴WSDL文件适用于为多个组织开发客户端应用程序的salesforce.com合作伙伴。 作为Force.com对象模型的松散类型表示形式,合作伙伴WSDL提供了一个API,可用于访问任何组织内的数据。

Bulk Processing with API Calls:

事务密集型应用程序产生的开销较小,并且在批量组合和执行重复操作时性能会更好。 例如,对比应用程序可能加载对象的许多新实例的两种方式。 一个低效率的方法是使用一个循环插入单个对象实例的例程,为每个插入操作进行一次API调用。 更有效的方法是创建一个对象实例的数组,并让这个例程通过一个API调用来插入所有的对象。

适用的Force.com Web Services API调用(如create(),update()和delete()支持批量操作。 为了获得最大的效率,平台隐式地批量处理与显式批量操作相关的所有内部步骤,如图10所示。

p10.png

图10还说明了Force.com的批量处理引擎的独特机制,可以解决在任何一步中遇到的孤立故障。 当批量操作在部分保存模式下启动时,引擎会识别已知的启动状态,然后尝试执行过程中的每个步骤(批量验证字段数据,批量预触发器,批量保存记录等)。 如果引擎在任何步骤中检测到错误,则引擎将回滚违规操作和所有副作用,删除引发故障的行,并继续尝试批量处理剩余的行子集。 这个过程遍历整个过程的每个阶段,直到引擎可以提交行的一个子集而没有任何错误。 应用程序可以检查返回对象,以确定哪些行失败以及引发了哪些异常。

注意:根据应用程序的判断,批量操作也可以使用“要么全成功或要么全不成功”模式。 此外,批量操作期间触发器的执行受制于限制工作量的内部调节器。

Deletes, Undeletes, and The Recycle Bin:

当某人从自定义对象中删除单个对象实例(记录)时,Force.com只需通过修改对象实例的IsDeleted字段(在数据表中)将其标记为要删除的对象实例。 这有效地将对象放置在所谓的平台回收站中。 通过Force.com,用户可以从回收站中查看并恢复选定的对象实例长达30天,然后将其从内部数据表中永久删除。 该平台根据组织的用户许可总数限制其为组织维护的记录总数。

当某人删除涉及主从关系的父记录时,Force.com会自动删除所有相关的子记录,只要这样做不会违反任何参照完整性规则。 例如,当用户删除SalesOrder时,Force.com自动将删除级联到相关的LineItems。 如果有人随后从回收站还原父记录,平台也会自动恢复所有子对象实例。

相比之下,当某人删除涉及查找关系的引用父记录时,Force.com会自动将所有相关主键设置为空。 如果某个人随后恢复父记录,Force.com将自动恢复以前的空值关联关系,除非在删除操作和还原操作之间这些关联关系被重新分配了。

回收站还会存储丢失的字段及其数据,直到组织永久删除它们,或者已经过了45天,以先发生者为准。 直到那个时候之前,整个领域和所有的数据可用于恢复。

Data Definition Processing:

某些类型的对象定义修改需要的不仅仅是简单的UDD元数据更新。 在这种情况下,Force.com使用有效的机制来帮助降低平台多租户应用程序的总体性能影响。

例如,考虑当某人将列的数据类型从选取列表修改为文本时发生的情况。 Force.com首先为列的数据分配一个新插槽,批量复制与当前值关联的选取列表标签,然后更新列的元数据以使其指向新插槽。 发生这一切时,访问数据是正常的,应用程序继续运行,没有任何明显的影响。

作为另一个例子,考虑当某人向表中添加汇总摘要字段时会发生什么情况。 在这种情况下,Force.com使用高效批量操作在后台异步计算初始摘要。 在进行后台计算时,查看新字段的用户会收到Force.com平台当前正在计算字段值的指示。

内部查询优化

大多数现代数据库系统通过采用基于成本的查询优化器来确定最佳的查询执行计划,该优化器考虑有关目标表和索引数据的相关统计信息 但是,传统的基于成本的优化器统计信息是为单租户应用程序设计的,无法说明在多租户环境中执行查询的任何给定用户的数据访问特性。 例如,针对具有大量数据的对象(表)的给定查询对具有高可见性的用户(可以看到所有对象实例的管理员)与具有低可见性的用户( 销售人员只能看到与自己相关的行)使用不同执行计划,这样会更加高效。

为了提供足够的统计信息来确定多租户平台中的最佳查询执行计划,Force.com为每个虚拟多租户对象维护一组完整的优化程序统计信息(租户,组和用户级别)。 统计信息反映了特定查询可能访问的行数,仔细考虑了整个租户特定的对象统计信息(整个租户拥有的总行数等)以及更细化的统计信息(行数 特定的特权组或最终用户可能访问等)。

Force.com还维护其他类型的统计信息,证明对特定查询有帮助。 例如,该平台维护所有自定义索引的统计信息,以显示相应字段中的非空值和唯一值的总数,以及显示每个列表值的基数的选项列表字段的直方图。

当现有的统计数据不存在或不被认为有帮助时,Force.com的优化器会使用一些不同的策略来帮助构建合理的最佳查询。 例如,当查询过滤对象的Name字段时,优化器可以使用FallbackIndex数据透视表高效地查找请求的对象实例。 在其他情况下,优化器将在运行时动态生成缺少的统计信息。

与优化器统计结合使用时,Force.com的优化器还依赖与内部安全相关的表(Groups,Members,GroupBlowout和CustomShare),这些表维护有关平台用户安全域的信息,包括给定用户的组成员身份和自定义访问权限对象。

p11.png

图11中的流程图说明了当Force.com拦截对诸如Data之类的大型堆表之一中的数据的请求时发生的情况。 请求可能来自任何数量的来源,例如来自应用程序框架应用程序的页面请求,Web服务API调用或Apex脚本。 首先,平台执行考虑多租户感知统计的“预查询”。 然后,考虑预查询返回的结果,平台在特定的设置中建立一个最佳的数据库查询执行。

如表1所示,Force.com可以通过四种不同的方式执行相同的查询,具体取决于提交查询的人员和查询过滤条件的选择性。

Force.com全文搜索引擎

基于Web的应用程序用户期望具有交互式搜索功能,可以扫描应用程序数据的整个或选定范围,返回最新的排名结果,并在亚秒级响应时间内完成所有这些工作。 为了为平台应用程序提供强大的功能,Force.com使用基于外部搜索引擎的架构,如图12所示。

当应用程序更新文本字段(CLOB,Name等)中的数据时,称为索引服务器的平台后台进程池负责异步更新搜索引擎在核心数据库之外维护的相应索引。 为了优化索引过程,Force.com将修改过的文本数据块同步复制到一个内部的“待索引”表中,从而提供一个相对较小的数据源,以最小化索引服务器必须读取的数据量磁盘。 搜索引擎为每个组织(租户)自动维护单独的索引。

根据当前的索引服务器的负载和利用率,文本索引更新可能明显落后于实际的事务。 为了避免源自陈旧索引的意外搜索结果,Force.com还维护最近更新对象的MRU缓存,平台的应用程序服务器在实现全文搜索结果时会考虑这些对象。 该平台在每个用户和每个组织的基础上维护MRU缓存,以有效地支持可能的搜索范围。

p12.png

Force.com使用几种不同的方法来优化搜索结果中记录的排名。 例如,系统考虑执行搜索的用户的安全域并且权衡当前用户有权访问的那些对象。 系统还可以考虑特定对象的修改历史记录,并在比较静态的对象之前排列最新更新的对象。 用户可以根据需要选择权重搜索结果,例如,更加强调最近修改的对象。

APEX

Apex是一种强类型,面向对象的过程式编程语言,开发人员可以用它来声明程序变量和常量,并执行传统的流程控制语句(if-else,loops等),数据操作操作(insert,update,upsert,delete )以及代表Force.com应用程序的事务控制操作(setSavepoint,回滚)。 Apex在很多方面与Java相似。 开发人员可以构建Apex例程,为大多数应用程序事件添加自定义业务逻辑,包括按钮点击,数据更新,Web服务请求,自定义批处理服务等。

开发人员可以以两种不同的形式构建Apex程序:作为匿名独立脚本,可以根据需要执行,也可以作为在发生特定数据库操作事件(插入,更新,删除或取消删除)之前或之后自动执行的触发器。 无论哪种形式,Force.com都会编译Apex代码并将其作为元数据存储在UDD中。 当组织中的某个人第一次调用Apex例程时,Force.com的运行时解释程序会将编译后的程序版本加载到该组织的MRU缓存中。 此后,当来自同一组织的任何用户需要使用相同的例程时,Force.com可以节省内存并避免重新编译程序的开销,这是通过共享已经在内存中的准备运行的程序来实现的。

Apex不仅仅是“另一种程序语言”.Apex是一个完整的Force.com组件,可帮助平台提供可靠的多租户应用程序。 例如,Force.com自动验证Apex类中的所有嵌入式Sforce对象查询语言(SOQL)和Sforce对象搜索语言(SOSL)语句,以防止在运行时失败的代码。 然后,平台为有效的Apex类维护相应的对象相关性信息,并使用这些信息来防止元数据的更改,否则这些元数据会破坏相关的应用程序。

许多Apex标准类和系统静态方法为底层平台特性提供了简单的接口。 例如,插入,更新和删除等系统静态DML方法有一个简单的布尔参数,开发人员可以使用它来指示所需的批量处理选项(全部或全部或部分保存); 这些方法还会返回调用例程可以读取的结果对象,以确定哪些记录未成功处理以及为什么。 Apex和Force.com平台功能之间的直接联系的其他示例包括内置的Apex电子邮件类,HTTP(RESTful)服务类和XmlStream类,仅举几例。

为了防止共享的多租户平台资源遭到恶意或无意的垄断,Force.com拥有一系列与Apex代码执行相关的管理员和资源限制。例如,Force.com密切监视Apex脚本的执行情况,并限制它可以使用多少CPU时间,可以使用多少内存,可以执行多少个查询和DML语句,可以执行多少个数学计算,以及如何执行很多出站的Web服务调用,以及更多。平台优化器认为执行代价过高的个别查询会向调用方抛出运行时异常。虽然这样的限制听起来可能有些限制,但它们对于保护所有相关应用程序的共享平台的整体可扩展性和性能是必要的。从长远来看,这些措施有助于推动平台开发人员更好的编码技术,为每个人创造更好的体验。例如,最初试图编写循环的开发人员会因为资源限制而无效地一次更新一千行,将会收到运行时异常,然后开始使用Force.com的高效批量处理API调用。

为了进一步避免由编写不佳的应用程序引起的潜在平台问题,部署新的生产应用程序是一个严格管理的过程。 在组织可以将新的自定义应用程序从开发转换到生产状态之前,salesforce.com需要单元测试来验证应用程序的Apex例程的功能。 提交的单元测试必须覆盖不少于应用程序源代码的75%。 Salesforce.com会在Force.com沙箱环境中执行提交的单元测试,以确定应用程序是否会对整个多租户人群的性能和可伸缩性产生不利影响。 单个单元测试的结果表示基本信息,例如执行的总行数以及有关代码的特定信息,这些信息并不是由测试执行来获取的。

一旦应用程序通过salesforce.com进行生产认证,应用程序的部署过程由一个事务组成,该事务将所有应用程序的元数据复制到生产Force.com实例中,并重新执行相应的单元测试。 如果进程的任何部分失败,Force.com只是回滚事务并返回异常来帮助解决问题。

注意:Salesforce.com为每个应用程序的每个开发版本重新开始了单元测试,以主动了解新的平台功能和增强功能是否会打破现有的应用程序。

p13.png

历史统计

多年的经验已经将Force.com转变成一个极其快速,可扩展且可靠的多租户互联网应用平台。 作为说明Force.com支持Internet规模应用程序的成熟能力,请考虑图13.请注意,随着时间的推移,平均页面响应时间减少或保持稳定(性能的一种衡量),同时平均事务量同时增加 (可扩展性的一种衡量)。

对于更多的平台数据,如计划维护,交易量和速度的历史信息等,请访问信任。 salesforce.com是Force.com社区的实时系统性能和安全信息的家园。

总结

平台即服务(PaaS)和软件即服务(SaaS)是当代软件应用程序开发和交付模式,越来越多的组织正在使用这些模型来缩短上市时间,降低资本支出并提高全球竞争力 经济。 基于互联网的共享计算平台是有吸引力的,因为它们让企业能够根据需要快速访问托管的软件资产,并且完全避免了购买,安装,配置和持续维护本地数据中心相关的成本和复杂性, 以及硬件,软件和随行的管理人员。

在这些模式转变的最前沿,最成功的按需SaaS / PaaS公司是salesforce.com,它最近获得了成为标准普尔500指数中第一个按需软件供应商的地位。从极其成功的salesforce.com CRM SaaS应用程序中脱颖而出,Force.com是一个通用的互联网应用程序开发和交付平台,企业和服务提供商已经构建了所有类型的定制业务应用程序,包括供应链管理,计费,会计,合规跟踪,人力资源管理和理赔处理应用程序。该平台的元引擎架构使任何人都能够高效地构建和交付复杂的,可定制的任务关键的Internet规模多租户应用程序。使用基于标准的Web服务API和本地平台开发工具,Force.com开发人员可以轻松构建基于Web的应用程序的所有组件,包括应用程序的数据模型(表,关系等),用户界面(数据输入表单,报告等),业务逻辑(工作流,验证等),与其他应用程序的集成等等。

在过去的十年中,salesforce.com的工程师已经对Force.com平台的所有层进行了多租户优化,使平台能够提供前所未有的互联网可扩展性,达到每日1.7亿次交易的高峰。 诸如批量数据处理API,Apex编程语言,外部全文本搜索引擎以及其独特的查询优化器等平台功能有助于使多租户平台应用程序高效且可扩展,开发人员很少或根本没有在意。

Salesforce.com用于部署生产应用程序的托管方法确保了所有相关应用程序的一流性能,可扩展性和可靠性。 此外,salesforce.com持续监控并收集来自Force.com应用程序的操作信息,以帮助推动渐进式改进和新的平台功能,立即使现有和新应用程序受益。

Leave a comment

随时欢迎您 联系我们