Force.com 多租户架构
本文参考自官方文档。
多租户架构
作为云计算平台的先驱,Salesforce最大的特点是“软件即服务”(Software as a Service,Saas)。实现这种技术的基础便是“多租户架构”(Muntitenancy)。
定义引自维基百科:
多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用户间数据的隔离性。
这种架构的优点在于:
- 所有的用户高效共享所有的资源
- 用户的资源之间不会互相影响
多租户架构的核心——元数据驱动
Salesforce多租户架构的核心是元数据驱动。不同于传统的关系数据库结构,Force.com中的对象、字段等并没有存储在实际的、静态的数据表中。在Force.com中,这些对象、字段等由元数据定义,在运行时动态编译生成。
Force.com中定义了一个全局数据字典(Universal Data Dictionary,简称UDD)。在UDD中存储了各种逻辑数据,包括但不限于:
- 对象(Object),相当于传统关系数据库中的数据表
- 字段(Field),相当于传统关系数据库中的字段
- 数据库触发器(Database Trigger)
- 存储过程(Stored Procedure)
举个例子。当用户创建了一个对象,比如“地址”,Force.com并不会真正的创建一个名为“地址”的数据表,而是将“地址”对象的定义保存为元数据。在运行时,系统会读取“地址”的定义,然后将其动态编译成“地址”对象,供用户使用。
这样做的好处是当用户需要修改对象定义时,在Force.com的后台不需要修改某个数据表的结构,而只是修改数据表中的某一条记录,让整个过程变得高效、稳定。
与此同时,Force.com中也使用了许多复杂的缓存技术来缓存诸多元数据,从而提高系统的效率。
元数据存储的数据模型
Force.com中使用诸多数据表来存储元数据和其他数据及关系。在实际的系统中它们有着复杂的名字和定义。为了描述方便起见,在下文将它们的名称做简化,着重描述它们的功能。
-
MT_Objects表:用于存储对象的定义,包括了其唯一的ID、从属的组织的ID、名字等。在Salesforce系统中的所有“租户”组织的对象定义同时保存在这一个表中
-
MT_Fields表:用于存储对象字段的信息,包括了其唯一的ID、从属的组织的ID、从属的对象的ID、名字、字段类型等。在Salesforce系统中的所有“租户”组织包含的字段同时保存在这一个表中
-
MT_Data表:用于存储各个对象的实际数据,相当于传统关系数据库中的一行记录。在Salesforce系统中所有“租户”组织中的数据同时保存在这一个表中
-
MT_Clobs表:CLOB是“character large objects”的简称。这些对象可以存储长达32000字符的数据。当MT_Data表中存在的数据包含过多的字符时,系统会将这些长字符数据存储在MT_Clobs表中,而在MT_Data表中存储一个MT_Clobs表某一行的ID值,从而精简MT_Data表
-
MT_Indexes表:这是一个数据透视表(Pivot table),用于存储MT_Data表中数据的索引。该表主要用于提高数据的搜索效率
-
MT_Unique_Indexes表:该表和MT_Indexes表类似,也是一个数据透视表,也存储了数据的索引。不同之处在于该表中的数据索引保持着唯一性。在用户给某字段增加唯一约束时,系统会将该字段的内容记录在此表中。当用户插入重复的值的时候,系统会根据该表的内容给出警告信息
-
MT_Fallback_Indexes表:MT_Fallback_Indexes表中保存了所有数据的名字(Name)。在特殊情况下,Salesforce有可能无法完成用户需要的搜索。在这种情况下,Salesforce会启用备用搜索机制,直接查询MT_Fallback_Indexes表中的数据,从而给出名字符合搜索条件的数据