1. 引言
隨著網(wǎng)絡(luò)經(jīng)濟(jì)時(shí)代的到來(lái),廣大中小型企業(yè)為了實(shí)現(xiàn)低成本產(chǎn)品營(yíng)銷(xiāo),紛紛將目光集中在企業(yè)銷(xiāo)售管理系統(tǒng)的租用上。SaaS(Software as a Service)模式的提出正是滿(mǎn)足這種需求的可靠方案。基于SaaS模式,所有企業(yè)不必自己設(shè)計(jì)開(kāi)發(fā)銷(xiāo)售管理系統(tǒng),只需向服務(wù)提供商注冊(cè)租用即可。這種軟件租用模式為企業(yè)節(jié)省了大量的金錢(qián)和時(shí)間成本,租戶(hù)企業(yè)只需按月或按流量提交費(fèi)用即可享受服務(wù)。在SaaS技術(shù)體系中,多租戶(hù)技術(shù)是整個(gè)架構(gòu)的基礎(chǔ)和關(guān)鍵,它是一種適合租用服務(wù)的軟件架構(gòu),其主要的思想是在多個(gè)租戶(hù)共用相同系統(tǒng)或程序組件時(shí)如何保持各個(gè)租戶(hù)之間的數(shù)據(jù)隔離性,因此,多租戶(hù)技術(shù)可以簡(jiǎn)單理解為是多租戶(hù)的數(shù)據(jù)隔離機(jī)制的設(shè)計(jì)與架構(gòu),這對(duì)于租戶(hù)和服務(wù)提供商節(jié)約成本都具有重要意義。
2. 多租戶(hù)技術(shù)實(shí)現(xiàn)方案
當(dāng)前,實(shí)現(xiàn)多租戶(hù)技術(shù)的方案基本上可以分為三個(gè)類(lèi)別。第一種方案是獨(dú)立設(shè)備實(shí)現(xiàn)多租戶(hù)數(shù)據(jù)隔離,服務(wù)供應(yīng)商為每一個(gè)租戶(hù)都提供一套服務(wù)器設(shè)備和應(yīng)用程序?qū)崿F(xiàn),這種方案服務(wù)提供商投入成本多,因此租戶(hù)承擔(dān)的服務(wù)費(fèi)用比較高,但是租戶(hù)數(shù)據(jù)最為安全可靠,不涉及租戶(hù)之間數(shù)據(jù)隔離問(wèn)題。第二種方案是虛擬技術(shù)實(shí)現(xiàn)多租戶(hù)數(shù)據(jù)隔離,服務(wù)供應(yīng)商為若干租戶(hù)共用一套服務(wù)器設(shè)備,使用虛擬技術(shù)將該設(shè)備虛擬成多個(gè)操作系統(tǒng),每一個(gè)虛擬的操作系統(tǒng)為租戶(hù)提供獨(dú)立的應(yīng)用軟件和數(shù)據(jù)庫(kù)實(shí)例,這種使用虛擬技術(shù)共享硬件設(shè)備的方案使服務(wù)提供商和租戶(hù)減少了投人成本,租戶(hù)數(shù)據(jù)安全程度降低,但也是易于實(shí)現(xiàn)數(shù)據(jù)隔離的方案。第三種方案是應(yīng)用級(jí)數(shù)據(jù)共享實(shí)現(xiàn)租戶(hù)數(shù)據(jù)隔離,所有租戶(hù)共用同一套服務(wù)器設(shè)備、軟件應(yīng)用程序和數(shù)據(jù)庫(kù)實(shí)例,數(shù)據(jù)隔離機(jī)制需要從軟件架構(gòu)上控制實(shí)現(xiàn),包括web session考慮和數(shù)據(jù)庫(kù)設(shè)計(jì)等內(nèi)容,該實(shí)現(xiàn)方案技術(shù)門(mén)檻較高,但租戶(hù)共享程度非常高,租戶(hù)和供應(yīng)商的投入成本將為最低,唯一可能的缺點(diǎn)就是數(shù)據(jù)安全和隔離機(jī)制需要擔(dān)心,所以這種方案非常適合資本不算充裕的中小型企業(yè)。
由于企業(yè)銷(xiāo)售管理系統(tǒng)主要為中小型企業(yè)提供銷(xiāo)售管理服務(wù),所以我們選擇第三種多租戶(hù)技術(shù)實(shí)現(xiàn)方案。
3. 企業(yè)銷(xiāo)售管理系統(tǒng)中的多租戶(hù)技術(shù)方案
多租戶(hù)共享技術(shù)是實(shí)現(xiàn)多個(gè)租戶(hù)企業(yè)在同一環(huán)境中共享同一軟件程序、中間件、服務(wù)器、數(shù)據(jù)庫(kù)實(shí)例和硬件設(shè)備的軟件架構(gòu)技術(shù),其主要職責(zé)是對(duì)多個(gè)租戶(hù)的數(shù)據(jù)進(jìn)行安全隔離,使各個(gè)租戶(hù)企業(yè)應(yīng)用互不干擾。要設(shè)計(jì)多租戶(hù)共享架構(gòu)方案,必須從以下三個(gè)方面進(jìn)行設(shè)計(jì),只有滿(mǎn)足以下三個(gè)方面,才能達(dá)到租戶(hù)之間數(shù)據(jù)隔離的效果,真正實(shí)現(xiàn)多租戶(hù)共享方案。
3.1 數(shù)據(jù)表設(shè)計(jì)
要實(shí)現(xiàn)多租戶(hù)共享同一數(shù)據(jù)庫(kù),數(shù)據(jù)表必須通過(guò)額外的TenantlD字段區(qū)分租戶(hù)數(shù)據(jù),這意味著將為每一個(gè)數(shù)據(jù)表添加一個(gè)TenantlD字段,以達(dá)到租戶(hù)之間的數(shù)據(jù)隔離的目的。
數(shù)據(jù)表與實(shí)體關(guān)聯(lián)緊密,數(shù)據(jù)表改變了模型,實(shí)體亦應(yīng)該隨之改變。因此我們很容易想到為每一個(gè)實(shí)體添加一個(gè)tenantld屬性與之對(duì)應(yīng),但感覺(jué)這樣設(shè)計(jì)過(guò)于簡(jiǎn)單冗余,所以我們可以為所有的實(shí)體抽象出一個(gè)基類(lèi)BaseEntity,將tenantld屬性加入ilBaseEntity,其它實(shí)體只需繼承該類(lèi)即可。其代碼如下:
@MappedSuperclass
public class BaseEntity implements Serializable{
private String id;// ID
private String tenantld;//多租戶(hù)標(biāo)識(shí)
}
從上面代碼可以看出,基類(lèi)BaseEntity不僅含有多租戶(hù)ID屬性,還包含id屬性,Id屬性是實(shí)體的唯一標(biāo)識(shí),對(duì)應(yīng)于數(shù)據(jù)表的主鍵。
3.2 Web會(huì)話(huà)支持
數(shù)據(jù)庫(kù)模式的修改為多租戶(hù)數(shù)據(jù)分離提供了機(jī)制,為了配合這種分離,本系統(tǒng)的前端web應(yīng)用需要加入特定屬性的會(huì)話(huà)支持。
HTTP作為一種無(wú)狀態(tài)的協(xié)議,web服務(wù)器不能識(shí)別哪些請(qǐng)求是同一瀏覽器發(fā)出的,因此web Session機(jī)制才應(yīng)運(yùn)而生,它立足于web服務(wù)器端,能夠唯一標(biāo)識(shí)每一個(gè)用戶(hù)的狀態(tài)。借助會(huì)話(huà)狀態(tài),web服務(wù)器能夠把屬于同一會(huì)話(huà)中的一系列請(qǐng)求和響應(yīng)過(guò)程關(guān)聯(lián)起來(lái)。
在此基礎(chǔ)上,將租戶(hù)ID信息一同存人會(huì)話(huà)中,使其作為該用戶(hù)的一個(gè)狀態(tài)屬性,這樣系統(tǒng)能夠根據(jù)會(huì)話(huà)屬性得知該用戶(hù)屬于哪個(gè)租戶(hù)范圍,也就能在進(jìn)一步的數(shù)據(jù)請(qǐng)求過(guò)程中加入租戶(hù)ID參數(shù),以完成數(shù)據(jù)隔離的目標(biāo)。
根據(jù)上圖,用戶(hù)首次請(qǐng)求會(huì)先進(jìn)行身份驗(yàn)證,審核通過(guò)后系統(tǒng)為該用戶(hù)生成一個(gè)匹配的會(huì)話(huà)對(duì)象,會(huì)話(huà)對(duì)象除了存儲(chǔ)用戶(hù)信息外,還要存儲(chǔ)一個(gè)租戶(hù)ID屬性,這個(gè)屬性將成為系統(tǒng)為該用戶(hù)提供數(shù)據(jù)的約束條件,能夠有效避免其它租戶(hù)數(shù)據(jù)的暴露問(wèn)題。
3.3 數(shù)據(jù)庫(kù)請(qǐng)求攔截
系統(tǒng)利用會(huì)話(huà)機(jī)制存儲(chǔ)了租戶(hù)ID屬性,接下來(lái)我們將其拼接成HQL條件發(fā)送給數(shù)據(jù)庫(kù)就能實(shí)現(xiàn)多租戶(hù)的數(shù)據(jù)隔離,舉例如下:
from PRODUCT P where P.TENANTID='402881862be164ae012be16ab6fd0004'
上面HQL查詢(xún)語(yǔ)句中,我們?yōu)槠涮砑恿薚ENANTID限制條件,這樣就有效過(guò)濾掉其他租戶(hù)的數(shù)據(jù),實(shí)現(xiàn)了產(chǎn)品實(shí)體的數(shù)據(jù)隔離。那么當(dāng)保存、修改和刪除數(shù)據(jù)時(shí),我們也需要進(jìn)行隔離機(jī)制的控制。
由以上論述可知本系統(tǒng)已經(jīng)可以做到基于多租戶(hù)的數(shù)據(jù)隔離,但是我們不可能將所有的SQL語(yǔ)句都手動(dòng)修改生以上模式:首先,將所有SQL都加上租戶(hù)ID信息,那么代碼過(guò)于僵化,一旦由于需求變動(dòng),代碼改動(dòng)量大;其次,當(dāng)前架構(gòu)層次實(shí)現(xiàn)方案中一般很少直接使用JDB C,而是選擇用持久層實(shí)體關(guān)系映射框架實(shí)現(xiàn),但是修改那些持久層框架難度系數(shù)過(guò)高;再次,系統(tǒng)中每次修改、刪除都要進(jìn)行租戶(hù)ID 比對(duì)邏輯,這種冗余邏輯大量分散在系統(tǒng)各處,不利于系統(tǒng)維護(hù)和升級(jí)。
基于以上原因,我們采用A0P編程思想,對(duì)系統(tǒng)實(shí)體的保存、修改、刪除和加載等操作進(jìn)行攔截處理,將租戶(hù)ID對(duì)比等邏輯放在該攔截器中統(tǒng)一實(shí)現(xiàn),這樣既利于代碼維護(hù),又能快速實(shí)現(xiàn)多租戶(hù)之間數(shù)據(jù)互不干擾。
4. 結(jié)論
本文重點(diǎn)討論了多租戶(hù)技術(shù)的各種實(shí)現(xiàn)方案對(duì)比,并結(jié)合企業(yè)銷(xiāo)售管理系統(tǒng)給出了一個(gè)多租戶(hù)共享技術(shù)方案,其中討論了數(shù)據(jù)表設(shè)計(jì)、web會(huì)話(huà)支持和數(shù)據(jù)庫(kù)請(qǐng)求攔截這些具體設(shè)計(jì)細(xì)節(jié)。多租戶(hù)技術(shù)作為SaaS模式的關(guān)鍵性技術(shù),必會(huì)為廣大中小型企業(yè)節(jié)約成本和提供便利。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴(lài)品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:多租戶(hù)技術(shù)在企業(yè)銷(xiāo)售管理系統(tǒng)中的設(shè)計(jì)與應(yīng)用
本文網(wǎng)址:http://www.oesoe.com/html/solutions/1401931976.html