1. 引言
随着网络经济时代的到来,广大中小型企业为了实现低成本产品营销,纷纷将目光集中在企业销售管理系统的租用上。SaaS(Software as a Service)模式的提出正是满足这种需求的可靠方案。基于SaaS模式,所有企业不必自己设计开发销售管理系统,只需向服务提供商注册租用即可。这种软件租用模式为企业节省了大量的金钱和时间成本,租户企业只需按月或按流量提交费用即可享受服务。在SaaS技术体系中,多租户技术是整个架构的基础和关键,它是一种适合租用服务的软件架构,其主要的思想是在多个租户共用相同系统或程序组件时如何保持各个租户之间的数据隔离性,因此,多租户技术可以简单理解为是多租户的数据隔离机制的设计与架构,这对于租户和服务提供商节约成本都具有重要意义。
2. 多租户技术实现方案
当前,实现多租户技术的方案基本上可以分为三个类别。第一种方案是独立设备实现多租户数据隔离,服务供应商为每一个租户都提供一套服务器设备和应用程序实现,这种方案服务提供商投入成本多,因此租户承担的服务费用比较高,但是租户数据最为安全可靠,不涉及租户之间数据隔离问题。第二种方案是虚拟技术实现多租户数据隔离,服务供应商为若干租户共用一套服务器设备,使用虚拟技术将该设备虚拟成多个操作系统,每一个虚拟的操作系统为租户提供独立的应用软件和数据库实例,这种使用虚拟技术共享硬件设备的方案使服务提供商和租户减少了投人成本,租户数据安全程度降低,但也是易于实现数据隔离的方案。第三种方案是应用级数据共享实现租户数据隔离,所有租户共用同一套服务器设备、软件应用程序和数据库实例,数据隔离机制需要从软件架构上控制实现,包括web session考虑和数据库设计等内容,该实现方案技术门槛较高,但租户共享程度非常高,租户和供应商的投入成本将为最低,唯一可能的缺点就是数据安全和隔离机制需要担心,所以这种方案非常适合资本不算充裕的中小型企业。
由于企业销售管理系统主要为中小型企业提供销售管理服务,所以我们选择第三种多租户技术实现方案。
3. 企业销售管理系统中的多租户技术方案
多租户共享技术是实现多个租户企业在同一环境中共享同一软件程序、中间件、服务器、数据库实例和硬件设备的软件架构技术,其主要职责是对多个租户的数据进行安全隔离,使各个租户企业应用互不干扰。要设计多租户共享架构方案,必须从以下三个方面进行设计,只有满足以下三个方面,才能达到租户之间数据隔离的效果,真正实现多租户共享方案。
3.1 数据表设计
要实现多租户共享同一数据库,数据表必须通过额外的TenantlD字段区分租户数据,这意味着将为每一个数据表添加一个TenantlD字段,以达到租户之间的数据隔离的目的。
数据表与实体关联紧密,数据表改变了模型,实体亦应该随之改变。因此我们很容易想到为每一个实体添加一个tenantld属性与之对应,但感觉这样设计过于简单冗余,所以我们可以为所有的实体抽象出一个基类BaseEntity,将tenantld属性加入ilBaseEntity,其它实体只需继承该类即可。其代码如下:
@MappedSuperclass
public class BaseEntity implements Serializable{
private String id;// ID
private String tenantld;//多租户标识
}
从上面代码可以看出,基类BaseEntity不仅含有多租户ID属性,还包含id属性,Id属性是实体的唯一标识,对应于数据表的主键。
3.2 Web会话支持
数据库模式的修改为多租户数据分离提供了机制,为了配合这种分离,本系统的前端web应用需要加入特定属性的会话支持。
HTTP作为一种无状态的协议,web服务器不能识别哪些请求是同一浏览器发出的,因此web Session机制才应运而生,它立足于web服务器端,能够唯一标识每一个用户的状态。借助会话状态,web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。
在此基础上,将租户ID信息一同存人会话中,使其作为该用户的一个状态属性,这样系统能够根据会话属性得知该用户属于哪个租户范围,也就能在进一步的数据请求过程中加入租户ID参数,以完成数据隔离的目标。
根据上图,用户首次请求会先进行身份验证,审核通过后系统为该用户生成一个匹配的会话对象,会话对象除了存储用户信息外,还要存储一个租户ID属性,这个属性将成为系统为该用户提供数据的约束条件,能够有效避免其它租户数据的暴露问题。
3.3 数据库请求拦截
系统利用会话机制存储了租户ID属性,接下来我们将其拼接成HQL条件发送给数据库就能实现多租户的数据隔离,举例如下:
from PRODUCT P where P.TENANTID='402881862be164ae012be16ab6fd0004'
上面HQL查询语句中,我们为其添加了TENANTID限制条件,这样就有效过滤掉其他租户的数据,实现了产品实体的数据隔离。那么当保存、修改和删除数据时,我们也需要进行隔离机制的控制。
由以上论述可知本系统已经可以做到基于多租户的数据隔离,但是我们不可能将所有的SQL语句都手动修改生以上模式:首先,将所有SQL都加上租户ID信息,那么代码过于僵化,一旦由于需求变动,代码改动量大;其次,当前架构层次实现方案中一般很少直接使用JDB C,而是选择用持久层实体关系映射框架实现,但是修改那些持久层框架难度系数过高;再次,系统中每次修改、删除都要进行租户ID 比对逻辑,这种冗余逻辑大量分散在系统各处,不利于系统维护和升级。
基于以上原因,我们采用A0P编程思想,对系统实体的保存、修改、删除和加载等操作进行拦截处理,将租户ID对比等逻辑放在该拦截器中统一实现,这样既利于代码维护,又能快速实现多租户之间数据互不干扰。
4. 结论
本文重点讨论了多租户技术的各种实现方案对比,并结合企业销售管理系统给出了一个多租户共享技术方案,其中讨论了数据表设计、web会话支持和数据库请求拦截这些具体设计细节。多租户技术作为SaaS模式的关键性技术,必会为广大中小型企业节约成本和提供便利。
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/