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.guhuozai8.cn/