目前SAAS平台對於大家來說並不陌生,市場上真正屬於SAAS應用的並不是特別多,還有很大一部分是ASP的模式在運行,不管對於公司還是技術部門都是很大的挑戰。去年在做elearning項目的時候其實也就是一個ASP的模式擴充,ASP模式本身就會存在比較多的問題,雖然與傳統的項目型有一定的區別,但從技術角度來看,差別不太大。
最近要弄一個SAAS平台的東西,所以惡補了一下相關的知識,在這裡記錄一下我的實踐與總結。由於還沒有最終驗證也不太清楚效果如何。供大家討論,希望可以給我一些意見。
使用的資料庫Oracle10g,這篇只是從資料模型設計的角度來分析,使用的模式是:共用database獨立Schema。
Oracle中的實現方式:
1、共用一個資料庫執行個體,免費的使用Tenant_Free執行個體,收費的使用Tenant_VIP執行個體,平台的資料使用Tenant_Platform執行個體。
2、獨立Schema,通過建立每個Tenant的資料庫使用者來實現,每個使用者使用的資料表根據使用者匯入的資料進行初始化。配置資料自動產生的方式。通過測試一個執行個體產生幾萬個資料庫使用者是很正常的,如果按照一台普通的伺服器可以支撐1萬個Tenant的話,那發展到10萬使用者可能只需要10台伺服器的規模,是我可以接受的範圍。
3、原先考慮讓每個Tenant分配一個資料表空間,然後定義資料檔案的大小來實現對每個Tenant資料空間的限制,但經過測試發現Oracle中添加資料表空間是有限個數的,我測試的時候加到200個左右就報錯,提示超過資料表空間的最大數量。看來這種方法行不能。
如所示,所有的Tenant User都在使用者管理庫中進行管理,然後資料存取控制器通過Tenant User的資訊自動選擇Tenant對應的資料結構。可能我覺得這種模式是MVC的改進版本,即SAAS平台下要使用MVCD的模式(Model-View-Controller-DataAccess),資料管理層將模型層與控制層對資料管理方面的內容獨立出來,負責資料庫結構的管理、資料存取等功能。。
選擇的理由:
1、在oracle裡要使用獨立的database對於伺服器的記憶體要求實在太高了,一個執行個體分配的資源如果是200M的話,4G的伺服器只能支援20個租戶,這個成本我想沒有什麼人可以承受,所以第一種最簡單的方式我不採用。
2、選擇獨立schema是非常重要的,對於程式與效能都會有很大的提升,而且業務要求所有企業相關的資料表欄位都允許Tenant使用者自訂,所以我覺得是必要條件,所以只能選擇第二種模式。如果使用預留欄位或者通過欄位擴充表來儲存存在比較多的問題,比如檢索速度、欄位的限制、資料冗餘等缺點。而且對於使用者來說不太直觀。
3、從維護管理的角度考慮,備份的時候可以對每個資料庫使用者的資料進行單獨的備份,有利於對無效使用者的資料刪除與恢複的操作。同時也保證了使用者資料的安全性。
對SAAS程式的要求:
1、要求可以通過配置自動實現Tenant Schema中資料的CRUD操作。
2、資料報表及相關的查詢都要允許自訂,需要提供相關的功能。
3、API介面服務需要提供配置功能。