引言
软件即服务(Software as a Service,SaaS)是随着互联网技术而蓬勃发展的一种新的软件应用模式,其正深刻改变着企业信息系统的开发和运行方式。目前,企业内部大数据的形成使得传统的报表系统越来越难以满足需求,而SaaS系统能够将高可用性与大数据量相结合,满足苛刻的要求;此外,SaaS模式也可提升报表系统的应用范围,这符合新一代企业级报表系统的发展趋势。但目前为止,国内外的SaaS系统主要集中在CRM等较易SaaS化的业务系统上,对于通用的企业基础软件如报表等尚未有较多涉及,缺乏系统性的研究,市面上也无一套真正实用的私有云SaaS报表系统,这成为一个研究的空白。本文论述基于SaaS的报表系统的整体架构和关键技术。
?
1 传统报表系统
目前传统的报表系统通常为基于服务器的报表平台,可用于创建来自关系数据源和多维数据源数据的表格报表,通常这类报表系统采用三层B/S架构,分别为表示层、设计层和数据层。
(1)表示层(Presentation Tier)。
表示层将模板通过解析引擎结合数据展示成页面,也可以输出为HTML 页面和Excel、PDF、Word等第三方文件格式。
(2)设计层(Designer Tier)。
其主要任务是建立报表、修改报表、发布报表、生成模板等。这涉及报表的数据来源、报表的格式和报表输出,是连接表示层和数据层的桥梁。
(3)数据层(Data Tier)。
主要是和用户有关。报表系统可以与几种常用的数据库系统交互,可以输入多种数据,如SQL查询、参数、常量等,数据层主要存储并管理这些数据。传统的报表解析流程如图1所示。
图1 报表解析流程
传统的报表系统主要集中于报表的设计、展示、输出等方面,对于报表系统整体的架构设计、可扩展性、计算能力的可伸缩性考虑得较少,报表服务器几乎集中了全部功能,其系统架构不能很好地适应SaaS所需的高并发性、高可用性和高扩展性特点,为了适应SaaS必须进行重新设计。
?
2 SaaS报表特性
SaaS报表系统是一个相对较新的概念,目前系统性的研究还较少,没有成熟的产品可以借鉴。在进行SaaS报表系统设计之前,适当提炼SaaS报表的关键特性很有必要,经过多方调研,总结出SaaS报表系统应当具备的关键特性如下:
(1)报表多租户特性。多租户是SaaS的核心技术,其实质上是所有的用户和应用可以共享同一个基础架构和代码实现。由于此技术较通用,在此不作详述,下文关键技术将重点论述如何将报表数据与多租户结合起来。
(2)报表数据高安全性。由于在SaaS报表系统上将承载多个数以万计终端用户,涉及很多敏感信息的展示,所以数据安全问题是SaaS报表系统发展和成长的一个重要因素。
(3)报表界面和输出可定制性。在SaaS应用模式下,所有的报表应用使用的都是同一套代码、同一套硬件,但是实际应用是千差万别的,需求是个性化的。系统界面和输出必须具备强大的可定制性,并且要确保配置系统是简单且易于为用户所理解的,无需任何第三方的开发和维护。
(4)统一数据模型。由于SaaS报表系统为数据分析和展示类应用,导致其上面运行的应用都是以数据的浏览和增删改为核心,但SaaS报表系统面对的数据量更大、数据环境更复杂,SaaS报表系统需要一个统一的数据模型抽象多种异类数据。
?
3 系统设计
3.1 架构设计
SaaS报表系统并不是简单地将一套传统的报表系统放置到SaaS环境中。由于SaaS报表对于性能、伸缩性和高可用性的要求相比传统报表都提高很多,其处理的数据量也不在一个级别,其架构必须重新设计。一个典型的SaaS报表系统架构如图2所示。
? ? ??
图2 SaaS报表系统架构
(1)在最前面是SaaS报表系统网关,网关接受所有对于报表系统的访问,网关会根据请求按照一定的策略动态地将所属的租户转发给对应的服务器集群。服务器集群上运行同一套SaaS报表程序,每个集群都可支持成千上万用户,访问被平衡地分配给每个集群,这样做的好处是可以通过建立新的服务器集群来匹配新增加的用户。
每个服务器集群中都有一个负载均衡,如果一个地方的服务中断了,报表系统一旦检测到数据中断就会立即把负载均衡在下一个可用的设备上,使报表服务可以持续访问。
(2)当服务器集群收到请求之后,集群会先通过其内置的负载均衡服务器来将请求转发给负载轻的报表服务器。为了达到架构简化和高伸缩性的目的,报表服务可设计成HTTP无状态,在一个服务器集群内会有多个报表应用服务器提供无差别的服务以应对大规模的请求。
(3)考虑报表系统需要访问外部获取数据,由于访问速率的差别,服务器集群内还内置了独立的数据访问服务器。报表服务器通过数据访问服务获取数据,并可将获取的数据放置到数据处理服务器中进行数据加工。
(4)当报表服务在处理请求的时候,会将已经解析过的报表页面缓存到数据库中。再次解析时,如果发现已被缓存过,则会调用这个用户所属的共享数据库直接取得相关数据,加快报表解析的速度。共享数据库通常采用成熟的关系数据库产品,但需要考虑多租户应用。
SaaS报表系统架构设计关键点小结:
(1)使用独立的报表系统网关,根据负载量实现智能路由。
(2)报表服务器集群之间相互独立,保证高可用性。
(3)服务器集群内部有独立的数据访问和数据处理服务器。由于数据访问和数据处理与报表解析速度上的差异,采用异步和消息响应机制,最大程度提高报表实例服务器的负载率。
(4)报表服务必须采用HTTP无状态,应用系统通过独立的Session服务器解决身份认证问题。
(5)采用报表中立格式缓存报表页面,加速报表解析,提高报表输出页面的速度。
SaaS系统通常需具备多租户特性,SaaS报表也不例外。一个支持多租户的报表需要在数据库设计上能支持对数据和配置信息进行虚拟分区,从而使得每个使用报表的租户能使用到一个单独的虚拟报表实例,并且可以对这个虚拟实例进行定制化。数据库结构如图3所示。
? ? ??
图3 数据库结构图
共享数据库主要有3种类型的数据库表。
(1)元数据表。主要存放用户定制的对象和对象所包含的字段的结构信息。不保存具体的数据,主要有两大类:
①Object Metadata表。这个表主要存储对象的信息,其中主要字段包括对象的ObjID、拥有这个对象的租户的ID 和对象名称。
②Column Metadata表。这个表主要存储对象附带字段的信息,其中主要字段包括字段的ID、拥有这个字段的租户的ID、字段名称以及是否需要被检索。
(2)数据表。主要存储那些用户定制的对象和对象所包含的字段的数据,包括两大类:
①Data表。放置着上面那些对象和字段所对应的数据,核心字段有全局唯一的ID(GUID)、租户ID、对象ObjID和对象名称。
②Clob表。主要存放Clob二进制数据。
(3)透视表。用来维护检索、唯一性和关系等数据以优化查询效率。
①Index表。在运行的时候会将需要索引的数据从Data表同步到Index表中相对应的字段以供检索。
②Relationships表。定义对象之间的关系,起到方便和加速关系表数据读取的作用。
在物理层面,数据库里面所有表格,包括底下的索引,根据每个租户不同的租户ID进行分区。例如通过Oracle的Hash分区技术可将大规模的数据平均地分割成多个更小的和更容易管理的分块,从而帮助大数据库系统能够在多租户的环境下提升速度、伸缩性和可用性等。实际数据库结构如图4所示。
图4 数据库物理结构图
?
3.3 统一数据集
SaaS模式下的报表系统面临的数据源将比传统的报表系统复杂很多,数据来源有多种,主要有关系数据库、WebService、文件、数据立方体等,甚至有一些通过程序运算得到的外部数据。这要求SaaS报表系统有很强的数据访问和处理能力,并且从统一数据模型的角度,必须将这些异构数据源转换成一种统一的数据模型(UnifyDataSet)。二次开发用户无需关心数据源底层细节,只需关心统一数据集即可完成报表的制作。
统一数据集也是实现报表数据安全性的重要手段,其实现了对于具体数据库的屏蔽,用户无法直接操纵底层数据库。统一数据集是一个抽象的概念,其实际是规定了一套接口,数据源只要实现了这套接口,SaaS报表引擎就能够读取作为报表数据源使用。统一数据集主要有5个方法,如下:
(1)public int getColumnCount ();//获取Unify-DataSet的总列数。
(2)public String getColumnName(int columnIndex);//获取UnifyDataSet中第columnIndex列的列名。
(3)public boolean hasRow (int rowIndex);//判断是否存在第rowIndex行,这主要是用于处理超大数据时,完全遍历所有数据获取总行数相当困难,用这个方法来判断第rowIndex行是否存在,存在则可读取。
(4)public int getRowCount(); //获取UnifyData-Set的总行数。
(5)public Object getValueAt (int rowIndex,int columnIndex);//获取UnifyDataSet中第columnIndex列,第rowIndex行的数据。
随着NoSQL数据库的发展,SaaS报表系统也应支持MongoDB、Neo4J等NoSQL数据库。通过统一数据集的转换,用户应当无需关心底层的NoSQL数据库实现细节,只需关注上层的统一数据集模型。
?
3.4 报表输出可定制性
SaaS报表面向众多的二次开发系统,其输出必须具备灵活的可定制性。为达到此目的,报表输出时,并不是直接输出,而是先在云端被解析,生成与输出格式无关的报表实例,然后再渲染成各种格式,如HTML、Wap、Excel、PDF、Word等,原理如图5所示。
图5 基于中立格式报表实例报表输出
报表实例只含有最简单的单元格和浮动元素,里面是已经计算好的文本,在最终解析时,只需要进行布局计算和输出文本,速度非常快。
另一个采用中立报表实例的好处就是将来能够以较小代价灵活支持其它输出,例如WPS、Wap页面等,无需为每种格式重新开发报表解析引擎。采用中立报表示例还为报表缓存提供条件,通常由于报表实例解析时间较长,服务可在云端缓存报表实例,这样在面向最终用户时可快速渲染出报表。
?
4 应用实例
国家电网SaaS报表系统是基于国家电网统一应用开发平台构建的新一代企业私有云报表系统,其整体架构完全按照上述概念进行设计和构建。在实际应用中,国网电网SaaS报表系统被放置到由3个异地数据中心组成的统一云资源池中,大概有1万台服务器,在云资源管理平台基础上,通过报表系统治理工具完成所有具体报表部署系统的部署、升级、配置等运维工作。
系统从2013年3月份上线,迄今为止已经服务于22个业务系统,共计10万多个终端用户,有200多个二次开发人员在其之上开发业务专用报表,目前已拥有总计超过10万张报表模板,新上线的业务应用均无需单独采购和部署报表系统,节省了大量的软件硬件购买开支,取得了良好的经济效益和社会效益。
?
5 结束语
本文在结合传统报表系统和SaaS环境特性的基础上提出了构建基于SaaS模式的报表系统的基本要素,针对SaaS特点提出了SaaS报表系统的架构和关键设计,并且对其中的一些难点给出了具体的解决办法,其架构和思路可广泛应用于其它领域的企业级SaaS系统中。