1. 程式人生 > >何謂多租戶模式 ?

何謂多租戶模式 ?

cti 租戶 ref 不同的 過程 行數 問題 第三章 我們

原文:何謂多租戶模式 ?

一、什麽是多租戶模式

多租戶模式的定義:單個產品實例為多個用戶提供服務,同時用戶可按需購買使用產品資源,用戶數據相互隔離。

定義裏的用戶即租戶,租戶狹義上理解就是使用系統的人。廣義上來說還應該包括創建的系統、數據等一切與當前租戶有關的系統資源。

二、舉個栗子

2.1 傳統模式

假設我們有一個學生管理系統,有課程查詢、成績查詢兩個功能,每個學生都有賬號可以登陸,使用系統中的這兩個功能。然後我們把這個系統賣給很多個學校去使用,這時候需要給每個學校去部署一套系統。

2.2 多租戶模式

還是上面的系統,結合第一章節的定義,我們看多租戶模式下的系統架構,這時候我們只有一個學生管理系統實例,每個學校使用的時候首先以學校為單位進行租戶創建,然後可以按需購買系統功能,比如只需要成績查詢,這裏的每個學校就是一個租戶。

三、幾種數據隔離模式

3.1 共享數據表,租戶ID隔離

這種模式也是我們平日裏系統隔離用戶使用的模式,既在表中加一個用戶ID字段,多租戶這裏就是在表中多加一個租戶ID字段進行數據區分,登陸哪個租戶就通過ID查詢到對應租戶的數據。拿成績表的查詢SQL舉例就是:

select * from t_score where tenantid = ‘租戶的ID‘ 

3.2 共享數據庫,Schema隔離

該模式就是共享一個數據庫實例,然後根據租戶建立多個Schema,以Mysql數據庫為例,就是建立多個Mysql用戶,每個Mysql用戶下都有完整的系統表。這裏在系統開發時就需要根據租戶動態進行數據源切換,獲取對應租戶的Schema。

3.3 獨立數據庫

該模式就是完全獨立數據庫實例,還以Mysql數據庫為例,就是裝有很多個Mysql服務,每個租戶對應一個實例 ,每個實例下具有相同的Schema和表 。這裏也需要在系統開發時根據租戶動態進行數據源切換,獲取對應租戶的數據庫實例。

四、實現多租戶系統的幾個關鍵點

將一個傳統模式的系統,改成多租戶架構,大的方面來說,只需要做好這兩點即可實現,也是最關鍵的兩點。

4.1 租戶管理

上面3.1 給了一個SQL,這個SQL在實際開發時,會發現是不可用的,滿足不了需求,為什麽呢?回到上面的學生管理系統,想想看,學校管理員購買了一個租戶系統,而具體使用系統的人是學生,是學生在查成績,先想一個問題,學生的數據從哪來?

(1)學校管理員添加

也就是學校管理員創建了租戶系統後,在後臺通過學生添加功能進行學生信息錄入,這不就有了學生信息了,也容易關聯上租戶ID,看著好像沒有問題,我們來捋一下執行過程。

學生訪問系統 -> 輸入賬號密碼,點登陸後 -> 3.1 模式因為數據源是一個,所以直接連上查t_student表 -> 對比用戶名、密碼 - > 找到且密碼正確即認為登陸成功。

例外情況1:假如學生張三由學校A轉到了學校B,這時候學校A的租戶和學校B的租戶都有了張三的信息,這時候有兩條數據,怎麽比對?這時候就不對了,租戶ID還無法確定。這時候就需要下面的兩種方案。

例外情況2:假如使用的是3.2 或 3.3 的數據隔離模式,相當於有多個數據源,這時候登陸時連接哪一個數據源查?這時候也就不對了。租戶ID還無法確定。這時候同樣需要下面的兩種方案。

(2)學生註冊為租戶

方式一:學校想添加學生A,可以輸入學生A的郵箱地址,發送邀請,學生A收到郵件邀請,登陸平臺註冊為租戶(不創建系統),註冊後自動進入發送邀請學校的學生庫。

方式二:學生A直接登陸平臺註冊為租戶,學生A將註冊信息提供給學校管理員,學校管理員添加到學生庫。

存儲租戶的租戶表本身是共享的。然後需要 「租戶學生表」 (創建系統的租戶ID,學生租戶ID)

這時候登陸並查詢成績流程就是:學生輸入用戶名、密碼 -> 查詢租戶表 -> 登陸成功 -> 查詢租戶學生表 -> 選擇對應的租戶學校 -> 進入租戶系統首頁 -> 查詢成績

(3)特定登陸地址

即給每個租戶購買系統後,生成特定獨有的登陸地址,帶有學校的租戶ID,然後將登陸地址共享給學生即可。這也可以解決租戶ID無法確定的問題。而且無需學生註冊為租戶。

4.2 數據路由

數據路由是數據隔離後的關鍵點,3.1 模式下即實現SQL的包裝,做一層AOP,查詢的時候在原來的SQL上附加

 where tenantid = ‘‘ and studentid = ‘‘ 

3.2、3.3 則需要根據租戶ID動態切換數據源,代碼層面即獲取不同的Connection,實現細節限於篇幅,此處不展開了。

五、總結

其實如果拋開商業模式來說,淘寶、京東包括我們常見的系統從技術架構上看都可以算是一種多租戶系統,為什麽?

因為首先是單實例可以支持多用戶的,其次數據是可以根據用戶ID隔離的(同第三章節「共享數據表,租戶ID隔離」 模式)。

從整體架構上看又不是,為什麽?首先不滿足的是系統功能不是按需付費,像淘寶每個會員進去功能都是一樣的,不能按需挑選功能,你說我不要訂單功能,可能嗎?顯然不可能,你要不要訂單功能就在那。另外功能免費。

還有就是商業模式的問題,不是將軟件本身作為服務銷售,還拿淘寶來說,它售賣的是淘寶上的商品,而不是淘寶軟件本身的功能。所以模式上不是SAAS,嚴格上就不算多租戶系統。

最後給大家一個公式,完整的多租戶模式 = 多租戶商業模式 + 多租戶技術架構。

PS :可關註「風象南講全棧」公眾號,有機會成為作者微信私人好友

何謂多租戶模式 ?