0 引言
軟件即服務(wù)(Software as a Service,SaaS)是隨著互聯(lián)網(wǎng)技術(shù)而蓬勃發(fā)展的一種新的軟件應(yīng)用模式,其正深刻改變著企業(yè)信息系統(tǒng)的開發(fā)和運行方式。目前,企業(yè)內(nèi)部大數(shù)據(jù)的形成使得傳統(tǒng)的報表系統(tǒng)越來越難以滿足需求,而SaaS系統(tǒng)能夠?qū)⒏呖捎眯耘c大數(shù)據(jù)量相結(jié)合,滿足苛刻的要求;此外,SaaS模式也可提升報表系統(tǒng)的應(yīng)用范圍,這符合新一代企業(yè)級報表系統(tǒng)的發(fā)展趨勢。但目前為止,國內(nèi)外的SaaS系統(tǒng)主要集中在CRM等較易SaaS化的業(yè)務(wù)系統(tǒng)上,對于通用的企業(yè)基礎(chǔ)軟件如報表等尚未有較多涉及,缺乏系統(tǒng)性的研究,市面上也無一套真正實用的私有云SaaS報表系統(tǒng),這成為一個研究的空白。本文論述基于SaaS的報表系統(tǒng)的整體架構(gòu)和關(guān)鍵技術(shù)。
1 傳統(tǒng)報表系統(tǒng)
目前傳統(tǒng)的報表系統(tǒng)通常為基于服務(wù)器的報表平臺,可用于創(chuàng)建來自關(guān)系數(shù)據(jù)源和多維數(shù)據(jù)源數(shù)據(jù)的表格報表,通常這類報表系統(tǒng)采用三層B/S架構(gòu),分別為表示層、設(shè)計層和數(shù)據(jù)層。
(1)表示層(Presentation Tier)。
表示層將模板通過解析引擎結(jié)合數(shù)據(jù)展示成頁面,也可以輸出為HTML 頁面和Excel、PDF、Word等第三方文件格式。
(2)設(shè)計層(Designer Tier)。
其主要任務(wù)是建立報表、修改報表、發(fā)布報表、生成模板等。這涉及報表的數(shù)據(jù)來源、報表的格式和報表輸出,是連接表示層和數(shù)據(jù)層的橋梁。
(3)數(shù)據(jù)層(Data Tier)。
主要是和用戶有關(guān)。報表系統(tǒng)可以與幾種常用的數(shù)據(jù)庫系統(tǒng)交互,可以輸入多種數(shù)據(jù),如SQL查詢、參數(shù)、常量等,數(shù)據(jù)層主要存儲并管理這些數(shù)據(jù)。傳統(tǒng)的報表解析流程如圖1所示。
圖1 報表解析流程
傳統(tǒng)的報表系統(tǒng)主要集中于報表的設(shè)計、展示、輸出等方面,對于報表系統(tǒng)整體的架構(gòu)設(shè)計、可擴展性、計算能力的可伸縮性考慮得較少,報表服務(wù)器幾乎集中了全部功能,其系統(tǒng)架構(gòu)不能很好地適應(yīng)SaaS所需的高并發(fā)性、高可用性和高擴展性特點,為了適應(yīng)SaaS必須進行重新設(shè)計。
2 SaaS報表特性
SaaS報表系統(tǒng)是一個相對較新的概念,目前系統(tǒng)性的研究還較少,沒有成熟的產(chǎn)品可以借鑒。在進行SaaS報表系統(tǒng)設(shè)計之前,適當(dāng)提煉SaaS報表的關(guān)鍵特性很有必要,經(jīng)過多方調(diào)研,總結(jié)出SaaS報表系統(tǒng)應(yīng)當(dāng)具備的關(guān)鍵特性如下:
(1)報表多租戶特性。多租戶是SaaS的核心技術(shù),其實質(zhì)上是所有的用戶和應(yīng)用可以共享同一個基礎(chǔ)架構(gòu)和代碼實現(xiàn)。由于此技術(shù)較通用,在此不作詳述,下文關(guān)鍵技術(shù)將重點論述如何將報表數(shù)據(jù)與多租戶結(jié)合起來。
(2)報表數(shù)據(jù)高安全性。由于在SaaS報表系統(tǒng)上將承載多個數(shù)以萬計終端用戶,涉及很多敏感信息的展示,所以數(shù)據(jù)安全問題是SaaS報表系統(tǒng)發(fā)展和成長的一個重要因素。
(3)報表界面和輸出可定制性。在SaaS應(yīng)用模式下,所有的報表應(yīng)用使用的都是同一套代碼、同一套硬件,但是實際應(yīng)用是千差萬別的,需求是個性化的。系統(tǒng)界面和輸出必須具備強大的可定制性,并且要確保配置系統(tǒng)是簡單且易于為用戶所理解的,無需任何第三方的開發(fā)和維護。
(4)統(tǒng)一數(shù)據(jù)模型。由于SaaS報表系統(tǒng)為數(shù)據(jù)分析和展示類應(yīng)用,導(dǎo)致其上面運行的應(yīng)用都是以數(shù)據(jù)的瀏覽和增刪改為核心,但SaaS報表系統(tǒng)面對的數(shù)據(jù)量更大、數(shù)據(jù)環(huán)境更復(fù)雜,SaaS報表系統(tǒng)需要一個統(tǒng)一的數(shù)據(jù)模型抽象多種異類數(shù)據(jù)。
3 系統(tǒng)設(shè)計
3.1 架構(gòu)設(shè)計
SaaS報表系統(tǒng)并不是簡單地將一套傳統(tǒng)的報表系統(tǒng)放置到SaaS環(huán)境中。由于SaaS報表對于性能、伸縮性和高可用性的要求相比傳統(tǒng)報表都提高很多,其處理的數(shù)據(jù)量也不在一個級別,其架構(gòu)必須重新設(shè)計。一個典型的SaaS報表系統(tǒng)架構(gòu)如圖2所示。
圖2 SaaS報表系統(tǒng)架構(gòu)
(1)在最前面是SaaS報表系統(tǒng)網(wǎng)關(guān),網(wǎng)關(guān)接受所有對于報表系統(tǒng)的訪問,網(wǎng)關(guān)會根據(jù)請求按照一定的策略動態(tài)地將所屬的租戶轉(zhuǎn)發(fā)給對應(yīng)的服務(wù)器集群。服務(wù)器集群上運行同一套SaaS報表程序,每個集群都可支持成千上萬用戶,訪問被平衡地分配給每個集群,這樣做的好處是可以通過建立新的服務(wù)器集群來匹配新增加的用戶。
每個服務(wù)器集群中都有一個負(fù)載均衡,如果一個地方的服務(wù)中斷了,報表系統(tǒng)一旦檢測到數(shù)據(jù)中斷就會立即把負(fù)載均衡在下一個可用的設(shè)備上,使報表服務(wù)可以持續(xù)訪問。
(2)當(dāng)服務(wù)器集群收到請求之后,集群會先通過其內(nèi)置的負(fù)載均衡服務(wù)器來將請求轉(zhuǎn)發(fā)給負(fù)載輕的報表服務(wù)器。為了達到架構(gòu)簡化和高伸縮性的目的,報表服務(wù)可設(shè)計成HTTP無狀態(tài),在一個服務(wù)器集群內(nèi)會有多個報表應(yīng)用服務(wù)器提供無差別的服務(wù)以應(yīng)對大規(guī)模的請求。
(3)考慮報表系統(tǒng)需要訪問外部獲取數(shù)據(jù),由于訪問速率的差別,服務(wù)器集群內(nèi)還內(nèi)置了獨立的數(shù)據(jù)訪問服務(wù)器。報表服務(wù)器通過數(shù)據(jù)訪問服務(wù)獲取數(shù)據(jù),并可將獲取的數(shù)據(jù)放置到數(shù)據(jù)處理服務(wù)器中進行數(shù)據(jù)加工。
(4)當(dāng)報表服務(wù)在處理請求的時候,會將已經(jīng)解析過的報表頁面緩存到數(shù)據(jù)庫中。再次解析時,如果發(fā)現(xiàn)已被緩存過,則會調(diào)用這個用戶所屬的共享數(shù)據(jù)庫直接取得相關(guān)數(shù)據(jù),加快報表解析的速度。共享數(shù)據(jù)庫通常采用成熟的關(guān)系數(shù)據(jù)庫產(chǎn)品,但需要考慮多租戶應(yīng)用。
SaaS報表系統(tǒng)架構(gòu)設(shè)計關(guān)鍵點小結(jié):
(1)使用獨立的報表系統(tǒng)網(wǎng)關(guān),根據(jù)負(fù)載量實現(xiàn)智能路由。
(2)報表服務(wù)器集群之間相互獨立,保證高可用性。
(3)服務(wù)器集群內(nèi)部有獨立的數(shù)據(jù)訪問和數(shù)據(jù)處理服務(wù)器。由于數(shù)據(jù)訪問和數(shù)據(jù)處理與報表解析速度上的差異,采用異步和消息響應(yīng)機制,最大程度提高報表實例服務(wù)器的負(fù)載率。
(4)報表服務(wù)必須采用HTTP無狀態(tài),應(yīng)用系統(tǒng)通過獨立的Session服務(wù)器解決身份認(rèn)證問題。
(5)采用報表中立格式緩存報表頁面,加速報表解析,提高報表輸出頁面的速度。
3.2 報表多租戶設(shè)計
SaaS系統(tǒng)通常需具備多租戶特性,SaaS報表也不例外。一個支持多租戶的報表需要在數(shù)據(jù)庫設(shè)計上能支持對數(shù)據(jù)和配置信息進行虛擬分區(qū),從而使得每個使用報表的租戶能使用到一個單獨的虛擬報表實例,并且可以對這個虛擬實例進行定制化。數(shù)據(jù)庫結(jié)構(gòu)如圖3所示。
圖3 數(shù)據(jù)庫結(jié)構(gòu)圖
共享數(shù)據(jù)庫主要有3種類型的數(shù)據(jù)庫表。
(1)元數(shù)據(jù)表。主要存放用戶定制的對象和對象所包含的字段的結(jié)構(gòu)信息。不保存具體的數(shù)據(jù),主要有兩大類:
①Object Metadata表。這個表主要存儲對象的信息,其中主要字段包括對象的ObjID、擁有這個對象的租戶的ID 和對象名稱。
②Column Metadata表。這個表主要存儲對象附帶字段的信息,其中主要字段包括字段的ID、擁有這個字段的租戶的ID、字段名稱以及是否需要被檢索。
(2)數(shù)據(jù)表。主要存儲那些用戶定制的對象和對象所包含的字段的數(shù)據(jù),包括兩大類:
①Data表。放置著上面那些對象和字段所對應(yīng)的數(shù)據(jù),核心字段有全局唯一的ID(GUID)、租戶ID、對象ObjID和對象名稱。
②Clob表。主要存放Clob二進制數(shù)據(jù)。
(3)透視表。用來維護檢索、唯一性和關(guān)系等數(shù)據(jù)以優(yōu)化查詢效率。
①Index表。在運行的時候會將需要索引的數(shù)據(jù)從Data表同步到Index表中相對應(yīng)的字段以供檢索。
②Relationships表。定義對象之間的關(guān)系,起到方便和加速關(guān)系表數(shù)據(jù)讀取的作用。
在物理層面,數(shù)據(jù)庫里面所有表格,包括底下的索引,根據(jù)每個租戶不同的租戶ID進行分區(qū)。例如通過Oracle的Hash分區(qū)技術(shù)可將大規(guī)模的數(shù)據(jù)平均地分割成多個更小的和更容易管理的分塊,從而幫助大數(shù)據(jù)庫系統(tǒng)能夠在多租戶的環(huán)境下提升速度、伸縮性和可用性等。實際數(shù)據(jù)庫結(jié)構(gòu)如圖4所示。
圖4 數(shù)據(jù)庫物理結(jié)構(gòu)圖
3.3 統(tǒng)一數(shù)據(jù)集
SaaS模式下的報表系統(tǒng)面臨的數(shù)據(jù)源將比傳統(tǒng)的報表系統(tǒng)復(fù)雜很多,數(shù)據(jù)來源有多種,主要有關(guān)系數(shù)據(jù)庫、WebService、文件、數(shù)據(jù)立方體等,甚至有一些通過程序運算得到的外部數(shù)據(jù)。這要求SaaS報表系統(tǒng)有很強的數(shù)據(jù)訪問和處理能力,并且從統(tǒng)一數(shù)據(jù)模型的角度,必須將這些異構(gòu)數(shù)據(jù)源轉(zhuǎn)換成一種統(tǒng)一的數(shù)據(jù)模型(UnifyDataSet)。二次開發(fā)用戶無需關(guān)心數(shù)據(jù)源底層細(xì)節(jié),只需關(guān)心統(tǒng)一數(shù)據(jù)集即可完成報表的制作。
統(tǒng)一數(shù)據(jù)集也是實現(xiàn)報表數(shù)據(jù)安全性的重要手段,其實現(xiàn)了對于具體數(shù)據(jù)庫的屏蔽,用戶無法直接操縱底層數(shù)據(jù)庫。統(tǒng)一數(shù)據(jù)集是一個抽象的概念,其實際是規(guī)定了一套接口,數(shù)據(jù)源只要實現(xiàn)了這套接口,SaaS報表引擎就能夠讀取作為報表數(shù)據(jù)源使用。統(tǒng)一數(shù)據(jù)集主要有5個方法,如下:
(1)public int getColumnCount ();//獲取Unify-DataSet的總列數(shù)。
(2)public String getColumnName(int columnIndex);//獲取UnifyDataSet中第columnIndex列的列名。
(3)public boolean hasRow (int rowIndex);//判斷是否存在第rowIndex行,這主要是用于處理超大數(shù)據(jù)時,完全遍歷所有數(shù)據(jù)獲取總行數(shù)相當(dāng)困難,用這個方法來判斷第rowIndex行是否存在,存在則可讀取。
(4)public int getRowCount(); //獲取UnifyData-Set的總行數(shù)。
(5)public Object getValueAt (int rowIndex,int columnIndex);//獲取UnifyDataSet中第columnIndex列,第rowIndex行的數(shù)據(jù)。
隨著NoSQL數(shù)據(jù)庫的發(fā)展,SaaS報表系統(tǒng)也應(yīng)支持MongoDB、Neo4J等NoSQL數(shù)據(jù)庫。通過統(tǒng)一數(shù)據(jù)集的轉(zhuǎn)換,用戶應(yīng)當(dāng)無需關(guān)心底層的NoSQL數(shù)據(jù)庫實現(xiàn)細(xì)節(jié),只需關(guān)注上層的統(tǒng)一數(shù)據(jù)集模型。
3.4 報表輸出可定制性
SaaS報表面向眾多的二次開發(fā)系統(tǒng),其輸出必須具備靈活的可定制性。為達到此目的,報表輸出時,并不是直接輸出,而是先在云端被解析,生成與輸出格式無關(guān)的報表實例,然后再渲染成各種格式,如HTML、Wap、Excel、PDF、Word等,原理如圖5所示。
圖5 基于中立格式報表實例報表輸出
報表實例只含有最簡單的單元格和浮動元素,里面是已經(jīng)計算好的文本,在最終解析時,只需要進行布局計算和輸出文本,速度非?臁
另一個采用中立報表實例的好處就是將來能夠以較小代價靈活支持其它輸出,例如WPS、Wap頁面等,無需為每種格式重新開發(fā)報表解析引擎。采用中立報表示例還為報表緩存提供條件,通常由于報表實例解析時間較長,服務(wù)可在云端緩存報表實例,這樣在面向最終用戶時可快速渲染出報表。
4 應(yīng)用實例
國家電網(wǎng)SaaS報表系統(tǒng)是基于國家電網(wǎng)統(tǒng)一應(yīng)用開發(fā)平臺構(gòu)建的新一代企業(yè)私有云報表系統(tǒng),其整體架構(gòu)完全按照上述概念進行設(shè)計和構(gòu)建。在實際應(yīng)用中,國網(wǎng)電網(wǎng)SaaS報表系統(tǒng)被放置到由3個異地數(shù)據(jù)中心組成的統(tǒng)一云資源池中,大概有1萬臺服務(wù)器,在云資源管理平臺基礎(chǔ)上,通過報表系統(tǒng)治理工具完成所有具體報表部署系統(tǒng)的部署、升級、配置等運維工作。
系統(tǒng)從2013年3月份上線,迄今為止已經(jīng)服務(wù)于22個業(yè)務(wù)系統(tǒng),共計10萬多個終端用戶,有200多個二次開發(fā)人員在其之上開發(fā)業(yè)務(wù)專用報表,目前已擁有總計超過10萬張報表模板,新上線的業(yè)務(wù)應(yīng)用均無需單獨采購和部署報表系統(tǒng),節(jié)省了大量的軟件硬件購買開支,取得了良好的經(jīng)濟效益和社會效益。
5 結(jié)束語
本文在結(jié)合傳統(tǒng)報表系統(tǒng)和SaaS環(huán)境特性的基礎(chǔ)上提出了構(gòu)建基于SaaS模式的報表系統(tǒng)的基本要素,針對SaaS特點提出了SaaS報表系統(tǒng)的架構(gòu)和關(guān)鍵設(shè)計,并且對其中的一些難點給出了具體的解決辦法,其架構(gòu)和思路可廣泛應(yīng)用于其它領(lǐng)域的企業(yè)級SaaS系統(tǒng)中。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:基于SaaS模式的報表系統(tǒng)
本文網(wǎng)址:http://www.ezxoed.cn/html/consultation/10820613808.html